繁体   English   中英

用opencv进行qt5部署,如何修复lib安装路径?

[英]qt5 deployment with opencv, how to fix the lib install paths?

类似的问题已经部分解决这里dyld的:库未加载:LIB / libopencv_core.3.0.dylib原因:没有找到图片铅的解决方案没有为我工作。

我在Mac OS X 10.10.5中将Qt 5与openCV 3一起使用。 当我使用macdeployqt时,此过程没有openCV .dylib文件的正确路径。 它抱怨:

ERROR: no file at "/lib/libopencv_core.3.0.dylib"
ERROR: no file at "/lib/libopencv_highgui.3.0.dylib"
ERROR: no file at "/lib/libopencv_imgproc.3.0.dylib"

与错误的文件路径有关,该文件路径是相对的,但被解释为绝对的,根据:

$ otool -L myApp.app/Contents/MacOS/myApp 
myApp.app/Contents/MacOS/myApp:

(...)

    lib/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
    lib/libopencv_highgui.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
    lib/libopencv_imgproc.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)

(...)

当然,当应用程序在另一台计算机上运行时,该应用程序将崩溃,并抱怨上面缺少的库。

鉴于上述解决方案不起作用,我该如何解决? 或者在这种情况下,我该如何“更好地”应用上述解决方案? (我可能没有适当地调整它们)。

我尝试了3种不同的opencv 3安装:CMake,自制软件和macports。 问题仍然相同。

工作中的一颗善良的灵魂帮助我更好地理解了我如何适应使用install_name_tool的上述解决方案。 因为上述解决方案不适用于我的情况,所以这里有一个带有注释的脚本,该脚本详细描述了每个步骤。 该脚本假定您已经使用过macdeployedqt,并且拥有一个.app文件。 链接opencv_core,opencv_highgui和opencv_imgproc库时,此修补程序可用于opencv 3。 对于您自己的情况,您需要将LIB_DIR和APP_DIR更改为(分别)您的opencv库文件(.dylib)所在的目录以及.app包的路径(这里我的应用程序称为Qtfits_openmp)。 当然,可以使用一个更紧凑的脚本来完成此操作,但是我希望详细的步骤可以帮助任何人适应他/她自己的情况。

#! /bin/bash

LIB_DIR=~/Dev/opencv3_tbb_opencl/lib
APP_DIR=~/Dev/build-Qtfits_openmp-clang_omp-Release/Qtfits_openmp.app
# This script supposes here that you are in the parent directory of the app.

# check to what libs your app is "explicitly" linked to with otool -L $APP_DIR/Contents/MacOS/Qtfits_openmp
# If originally linking with LIBS += -lopencv_core -lopencv_highgui -lopencv_imgproc, you'd need to copy them in the .app with their dependencies.
# However, opencv has the path of symbolic links, ending with 3.0. , so we need to copy the actual files, i.e., with the whole version number 3.0.0. 
cp $LIB_DIR/libopencv_core.3.0.0.dylib $APP_DIR/Contents/Frameworks/libopencv_core.3.0.0.dylib
cp $LIB_DIR/libopencv_highgui.3.0.0.dylib $APP_DIR/Contents/Frameworks/libopencv_highgui.3.0.0.dylib
cp $LIB_DIR/libopencv_imgproc.3.0.0.dylib $APP_DIR/Contents/Frameworks/libopencv_imgproc.3.0.0.dylib
# Extra dependencies exist: otool -L libopencv_* will show you all the dependencies that you need to copy.
# Here we will also need to add imgcodecs and videoio to the .app
cp $LIB_DIR/libopencv_imgcodecs.3.0.0.dylib $APP_DIR/Contents/Frameworks/libopencv_imgcodecs.3.0.0.dylib
cp $LIB_DIR/libopencv_videoio.3.0.0.dylib $APP_DIR/Contents/Frameworks/libopencv_videoio.3.0.0.dylib


# With otool -L $APP_DIR/Contents/MacOS/yourApp , look at the .lib files with a wrong path. With the following result:
#   lib/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
#   lib/libopencv_highgui.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
#   lib/libopencv_imgproc.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)

# we need to fix the 3 libraries core, highgui and imgproc which are given here with an incorrect relative path. 
# Note that again, opencv kept the basename of the symbolic links (ending with 3.0.dylib), not the basename of the actual files (ending with 3.0.0.dylib)
# So we have to keep things consistent with what we did above. 

install_name_tool -change lib/libopencv_core.3.0.dylib @executable_path/../Frameworks/libopencv_core.3.0.0.dylib $APP_DIR/Contents/MacOS/Qtfits_openmp
install_name_tool -change lib/libopencv_highgui.3.0.dylib @executable_path/../Frameworks/libopencv_highgui.3.0.0.dylib $APP_DIR/Contents/MacOS/Qtfits_openmp
install_name_tool -change lib/libopencv_imgproc.3.0.dylib @executable_path/../Frameworks/libopencv_imgproc.3.0.0.dylib $APP_DIR/Contents/MacOS/Qtfits_openmp

# Now we need to fix the path to all the dependencies of each library file.
cd $APP_DIR/Contents/Frameworks

# Change the IDs
for i in libopencv*.dylib; do install_name_tool -id @executable_path/../Frameworks/$i $i; done

# Again, with otool -L libopencv_* , you will see that you need to change their paths so that your copied libraries are pointed to within the app.
# for each opencv lib that is not properly referenced, change it from the absolute or wrong-relative path to @executable_path/../Frameworks/

# fix libopencv_highgui
install_name_tool -change $LIB_DIR/libopencv_imgcodecs.3.0.dylib @executable_path/../Frameworks/libopencv_imgcodecs.3.0.0.dylib libopencv_highgui.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_core.3.0.dylib @executable_path/../Frameworks/libopencv_core.3.0.0.dylib libopencv_highgui.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_imgproc.3.0.dylib @executable_path/../Frameworks/libopencv_imgproc.3.0.0.dylib libopencv_highgui.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_videoio.3.0.dylib @executable_path/../Frameworks/libopencv_videoio.3.0.0.dylib libopencv_highgui.3.0.0.dylib

# fix libopencv_imgproc 
install_name_tool -change $LIB_DIR/libopencv_core.3.0.dylib @executable_path/../Frameworks/libopencv_core.3.0.0.dylib libopencv_imgproc.3.0.0.dylib

# fix libopencv_videoi
install_name_tool -change $LIB_DIR/libopencv_imgcodecs.3.0.dylib @executable_path/../Frameworks/libopencv_imgcodecs.3.0.0.dylib libopencv_videoio.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_imgproc.3.0.dylib @executable_path/../Frameworks/libopencv_imgproc.3.0.0.dylib libopencv_videoio.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_core.3.0.dylib @executable_path/../Frameworks/libopencv_core.3.0.0.dylib libopencv_videoio.3.0.0.dylib

# fix libopencv_imgcodecs
install_name_tool -change $LIB_DIR/libopencv_imgproc.3.0.dylib @executable_path/../Frameworks/libopencv_imgproc.3.0.0.dylib libopencv_imgcodecs.3.0.0.dylib
install_name_tool -change $LIB_DIR/libopencv_core.3.0.dylib @executable_path/../Frameworks/libopencv_core.3.0.0.dylib libopencv_imgcodecs.3.0.0.dylib

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM