【问题标题】:Adding external libraries deploying QT app mac OSX添加部署 QT app mac OSX 的外部库
【发布时间】:2017-09-07 04:55:12
【问题描述】:

我在部署使用 openCV 作为外部库的 QT 应用程序时遇到了困难。

http://doc.qt.io/qt-5/osx-deployment.html 页面上写着:To include a 3rd party library in the application bundle, copy the library into the bundle manually, after the bundle is created. 那么我应该在.app 文件夹中复制到哪里呢?

还有http://www.dafscollaborative.org/opencv-deploy.html 博客说要使用install_name_tool 来部署带有Qt 应用程序的openCV,但我不清楚他使用的路径,并且在我的情况下它给出了错误。

那么,我应该如何使用 opencv 库部署我的 QT 应用程序?

运行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 库出现什么错误?
  • @MichaelDautermann 它在我的本地系统上运行良好,但是当我将 dmg 共享给其他非 qt、非 opencv 系统运行时,双击时它甚至无法启动。
  • 第一个链接失效,已被doc.qt.io/qt-5/macos-deployment.html替换

标签: c++ qt deployment


【解决方案1】:

在 macOS 中,dylib 有一个嵌入路径,指向它期望放置在文件系统中的位置。链接到这些 dylib 的应用程序将期望在该位置找到 dylib。这是您可以使用 install_name_tool 修改并使用 otool -L 检查的路径。

@rpath 是一个占位符,表示链接到 dll 的应用程序的运行时路径。通过将 -rpath 标志传递给链接器来设置应用程序的运行时路径。运行时路径本身可以使用占位符@executable_path,您可以使用它设置相对于可执行文件的路径。

在您的情况下,如果您设置 -rpath @executable_path/../Frameworks,您必须将 Qt 库复制到应用程序包内的 Frameworks 文件夹中,以便您的应用程序找到它们。

【讨论】:

  • 我们将库复制到Framework文件夹后,您能否举例说明在链接库时要编写的命令。
  • 您不必在链接之前复制,在复制步骤发生之前链接就可以了。链接时dylib的位置没有影响,重要的是安装名称路径。如果您要询问使用 @rpath 的链接器命令的示例,则此问题的答案中有一个:stackoverflow.com/questions/27506450/…
【解决方案2】:

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

编译您的应用程序后,您就有了一个捆绑包。使用 macdeployqt 将 Qt 框架嵌入到您的包中。

之后,打开您的捆绑包,转到 Contents/Frameworks,您必须在此处拥有所有必需的 Qt 框架。只需在此处添加您的 opencv 库。

您的捆绑包现在包含所需的一切。

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多