OSX Dylibs 的 Qt .pro 文件设置而不是 install_name_tool?

Posted

技术标签:

【中文标题】OSX Dylibs 的 Qt .pro 文件设置而不是 install_name_tool?【英文标题】:Qt .pro File Settings for OSX Dylibs Instead of install_name_tool? 【发布时间】:2015-09-27 04:46:28 【问题描述】:

在部署我的 OSX 应用程序时,.app 文件无法找到我编写的自定义 dylib。不过,这有点奇怪:

它在 Qt Creator 中运行良好。 如果我转到命令行,cd 到我的可执行应用程序 (LibraryTester) 和 dylib 文件所在的目录,然后执行 ./LibraryTester,它工作得很好。 如果我双击可执行文件或 .app 文件图标,程序会崩溃,因为它找不到我创建的自定义 dylib。

现在,我可以像这样使用 install_name_tool 轻松解决这个问题:

install_name_tool LibraryTester -change mycustom.1.dylib @loader_path/mycustom.1.dylib

(关键是@loader_path 变量)

...但是,我的 Qt 5.5 项目的 .pro 文件中是否有一个设置,这样我就不必在部署时一直这样做?

【问题讨论】:

【参考方案1】:

修复方法是在将库添加到主应用程序项目之前在库本身上使用install_name_tool。看,我出错的地方是尝试在应用程序 (LibraryTester) 而不是 dylib 上执行此操作。

为了修复,我跑了:

install_name_tool -id @loader_path/mycustom.1.dylib mycustom.1.dylib

在自定义 dylib 文件上。 @loader_path 翻译为“主应用程序的同一目录”。因此,在您的 .app 文件夹中,应该是 Contents/MacOS

如果你愿意,你可以用@rpath 切换它,这将转换为Contents/Frameworks

这使您可以在每次编译主应用程序时进行动态测试。看,有些东西直到你双击 .app 文件夹来启动你的应用程序才会出现。当然,您可能能够从命令行运行您的应用程序及其相关的 dylib,并且您可能能够从 Qt Creator 内部运行它,但是在极少数情况下,在您双击之前某些事情可能不会作为问题出现.app 文件夹。

现在,这为您提供了一个临时解决方案,这样您在双击 .app 文件时无需继续执行命令行操作以使您的 dylib 与可执行文件一起工作。但是,当您准备好将此项目投入生产时,您应该使用命令macdeployqt

现在,您可能不知道 MacOS 上的 Qt/C++ 的另一个技巧。您可以将以下内容添加到您的 .pro 文件中,它会自动将您的 dylib 文件复制到与可执行文件(在我的示例中为 LibraryTester)相同的目录中:

mac 
  Resources.files += mycustom.1.dylib
# you can put more of these as you need, and it can even copy folders
# Resources.files += blah blah
  Resources.path = Contents/MacOS
  QMAKE_BUNDLE_DATA += Resources

【讨论】:

【参考方案2】:

QMAKE_LFLAGS_SONAME 添加到自定义dylib 的.pro 文件中

示例:

QMAKE_LFLAGS_SONAME = -Wl,-install_name,@executable_path/../Frameworks/

【讨论】:

以上是关于OSX Dylibs 的 Qt .pro 文件设置而不是 install_name_tool?的主要内容,如果未能解决你的问题,请参考以下文章

OSX 10.6 上的 Qt5

使用 macports 安装 opencv 并在 qt (osx) 中使用

如何在 os x 上使 Boost dylibs 通用(i386 和 x86_64)?

捆绑 dylibs,headerpad_max_install_names 不起作用

qt打开.pro文件问啥会卡在configure project上

从 OS X 终端编译 Qt 示例的问题