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?的主要内容,如果未能解决你的问题,请参考以下文章
使用 macports 安装 opencv 并在 qt (osx) 中使用
如何在 os x 上使 Boost dylibs 通用(i386 和 x86_64)?
捆绑 dylibs,headerpad_max_install_names 不起作用