在Xcode中调试时,OSX命令行工具可以正常工作,但在外部运行时无法加载.dylib

问题描述 投票:0回答:2

我正在使用Xcode构建一个依赖于外部.dylib文件的命令行工具。通常,如果这是一个打包的应用程序,我会将.dylib作为嵌入式框架包含在“Link Binary with Libraries”中。

相反,我只使用“Link Binary with Libraries”。我链接了9个库,当从finder开始时,应用程序成功找到了8个库。但是,1找不到,我不知道为什么。

我觉得困惑的部分原因在于我设置了“图书馆搜索路径”和“框架搜索路径”。据我所知,这些字段中的条目与Xcode项目文件的位置有关。但是,我不知道如何使用这些字段来指示库相对于二进制文件的最终位置的位置。

我不确定为什么它在调试模式下在Xcode中正常工作,但是当我在磁盘上运行文件并在Xcode之外运行时,它无法找到库。

dyld: Library not loaded: @rpath/libzmq.3.dylib
  Referenced from: /Users/username/Library/Developer/Xcode/DerivedData/ProjectName-aujthxhimuknufcrjzfhdwchezas/Build/Products/Debug/ProjectName
  Reason: image not found

我在“框架搜索路径”和“库搜索路径”中添加了“./”和调试/发布的递归选项。文件“libzmq.3.dylib”与最终可执行文件位于同一目录中。

xcode macos executable dynamic-linking
2个回答
0
投票

这里可能有一些问题,所以退一步看看事情可能会变得混乱可能是件好事。

  1. 将所有必需的.dylib复制到项目目录中
  2. 删除添加的框架搜索路径,(dylib不被视为“框架”)
  3. 图书馆搜索路径应该是您唯一需要查看的地方

构建设置

库搜索路径是编译器查找将链接到您的应用程序的dylib的位置:

$(inherited)
"$(SRCROOT)/path/to/dylib" 

我经常发现这两条路径运行得很好。顶部搜索主项目目录,第二个搜索源根目录下的/ path /。

enter image description here

建立阶段

enter image description here

Build Phases确定作为项目一部分的文件,库等的细节,例如使用“Link Binary With Libraries”链接dylib并添加“Copy Files Phase”。

链接本质上是在您的可执行文件和库之间建立连接(有几种方法可以链接库,这只是一个)。复制阶段允许您选择应该复制和定位dylib的位置,以便可执行文件在构建后使用(我经常将它们复制到可执行文件的目标)。

无论您的项目是命令行应用程序,如果没有专门从构建阶段复制所需的dylib,也不要指望您的应用程序链接到外部库(除非它是标准的);即便如此,如果dylib的路径发生变化或被删除,依赖于您未提供的库可能会使应用程序无效。我建议在可能的情况下为dylib提供可执行文件。


0
投票

以下是我为解决此问题所做的工作: 在“链接 - >运行路径搜索路径”下,添加:@loader_path。

请参见下图: qazxsw poi

© www.soinside.com 2019 - 2024. All rights reserved.