在Mac OSX上部署QT应用程序时如何添加外部库?

4
我在部署使用openCV作为外部库的QT应用程序时遇到了困难。
http://doc.qt.io/qt-5/osx-deployment.html页面上,它说:要将第三方库包含在应用程序包中,请在创建应用程序包后手动将库复制到包中。那么我应该把它复制到哪个.app文件夹内?
此外,http://www.dafscollaborative.org/opencv-deploy.html博客中建议使用install_name_tool来部署openCV和Qt应用程序,但他使用的路径对我来说不清晰,并且在我的情况下产生错误。
所以,我该如何部署我的QT应用程序和opencv库?
运行otool -L MyApplication.app/Contents/MacOS/MyApplication会给我以下输出:
@rpath/libopencv_calib3d.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_features2d.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_highgui.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_videoio.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_imgcodecs.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_video.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_photo.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_ml.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_imgproc.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_flann.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/libopencv_core.3.2.dylib (compatibility version 3.2.0, current version 3.2.0)
@rpath/QtWidgets.framework/Versions/5/QtWidgets (compatibility version 5.10.0, current version 5.10.0)
@rpath/QtGui.framework/Versions/5/QtGui (compatibility version 5.10.0, current version 5.10.0)
@rpath/QtCore.framework/Versions/5/QtCore (compatibility version 5.10.0, current version 5.10.0)
/System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
@rpath/QtXml.framework/Versions/5/QtXml (compatibility version 5.10.0, current version 5.10.0)
/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/AGL.framework/Versions/A/AGL (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.50.2)

你的应用程序中包含的openCV库出现了什么错误? - Michael Dautermann
@MichaelDautermann 我的本地系统可以正常运行,但是当我将 dmg 分享给其他非 qt、非 opencv 系统运行时,双击时甚至无法启动。 - arqam
第一个链接已经失效,已被 https://doc.qt.io/qt-5/macos-deployment.html 替换。 - Greenonline
2个回答

4
在macOS中,dylib包含了一个嵌入路径指向它期望被放置在文件系统的位置。链接到这些dylibs的应用程序将期望在该位置找到dylib。您可以使用install_name_tool修改此路径,并使用otool -L来查看它。
@rpath是一个占位符,表示链接到dll的应用程序的运行时路径。通过传递-rpath标志给链接器,可以设置应用程序的运行时路径。运行时路径本身可以使用占位符@executable_path,使您可以将路径设置为相对于可执行文件。
在您的情况下,如果您设置-rpath @executable_path/../Frameworks,那么您必须将Qt库复制到应用程序包内的Frameworks文件夹中,以便您的应用程序找到它们。

请问在将库复制到框架文件夹后,可以给出链接库时要编写的命令示例吗? - arqam
在链接之前不必复制,直接链接即可,复制步骤会在链接之后进行。dylib的位置在链接时没有影响,重要的是安装名称路径。如果您想要一个使用@rpath的链接器命令的示例,请参考此问题的答案:https://dev59.com/D14c5IYBdhLWcg3wz9BG - Stefan Werner

3

我不知道你是否已经找到答案,但这里有一个解决方案:

在编译应用程序后,会生成一个bundle。使用macdeployqt将Qt框架嵌入到bundle中。

之后,打开你的bundle,进入Contents/Frameworks目录,你必须把所有必要的Qt框架都添加进来。然后简单地添加你的opencv库即可。

现在,你的bundle包含了所有需要的东西。

祝好


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接