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

OSX命令行工具在Xcode中调试时工作正常,但在外部运行时无法加载.dylib,xcode,macos,executable,dynamic-linking,Xcode,Macos,Executable,Dynamic Linking,我正在使用Xcode构建一个依赖于外部.dylib文件的命令行工具。通常,如果这是一个打包的应用程序,我会将.dylib作为一个嵌入式框架包含在“链接二进制库”中 相反,我只使用“链接二进制与库”。我链接了9个库,当从finder启动时,应用程序成功地找到了其中的8个库。但是,1找不到,我也不知道为什么 我觉得部分困惑在于我设置“库搜索路径”和“框架搜索路径”的方式。据我所知,这些字段中的条目与Xcode项目文件的位置有关。但是,我不知道如何使用这些字段来指示库相对于二进制文件最终位置的位置 我

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

相反,我只使用“链接二进制与库”。我链接了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”与最终可执行文件位于同一目录中。

这里可能有一些错误,因此最好退一步,看看哪里可能会混淆

  • 将所有必需的.dylibs复制到项目目录
  • 删除添加的框架搜索路径(动态库不被视为“框架”)
  • 库搜索路径应该是您真正需要查找的唯一地方
  • 生成设置 库搜索路径是编译器查找将链接到应用程序的动态库的位置:

    $(inherited)
    "$(SRCROOT)/path/to/dylib" 
    
    我通常发现这两种方法都很有效。上面的一个搜索主项目目录,第二个搜索源根目录下的/path/

    构建阶段

    构建阶段确定作为项目一部分的文件、库等的细节,例如使用“将二进制文件链接到库”链接
    dylib
    ,并添加“复制文件阶段”

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


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

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

    请参见下面的附图:

    是否在生成设置中设置可执行文件的运行路径?通常,如果它在调试和非发布模式下工作,则意味着调试/发布模式的设置不同。此外,框架搜索路径和库搜索路径是链接时间设置,而不是运行时设置。您可能想将
    @loader\u path
    添加到
    运行路径中。我刚刚更新了我的原始帖子,因为我错误地说我在调试/发布时遇到了问题,但我想说我在XCode内部调试和在XCode外部运行构建版本(但仍在调试文件夹中)之间遇到了问题。我检查了,如果设置正确,并且所有dylib都使用
    @rpath
    作为安装名称,那么runpath就没有任何价值。