0

在部署我的 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 文件中是否有一个设置,这样我就不必在部署时一直这样做?

4

2 回答 2

0

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

例子:

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

于 2018-06-14T05:55:49.717 回答
0

修复是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
}
于 2015-09-28T01:00:50.513 回答