Xcode 5 如何从 App Bundle 链接动态库

Posted

技术标签:

【中文标题】Xcode 5 如何从 App Bundle 链接动态库【英文标题】:Xcode 5 how to Linking Dynamic Libraries from App Bundle 【发布时间】:2014-05-17 14:01:03 【问题描述】:

我想将一些库分发到我的 OS X 应用程序包中,最近两天我正在处理这个问题,但没能成功。直到现在我做了什么。

使用安装名称工具我有固定的库路径。此外,我还及时尝试了@loader_path/../Libraries 和@executable_path/../Libraries。

otool -L libMagickWand-6.Q16.2.dylib 
@rpath/../Libraries/libMagickWand-6.Q16.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    @rpath/../Libraries/libMagickCore-6.Q16.2.dylib (compatibility version 3.0.0, current version 3.0.0)
    @rpath/../Libraries/libfreetype.6.dylib (compatibility version 18.0.0, current version 18.2.0)
    @rpath/../Libraries/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.5)
    @rpath/../Libraries/libz.1.2.5.dylib (compatibility version 1.0.0, current version 1.2.5)
    @rpath/../Libraries/libltdl.7.dylib (compatibility version 11.0.0, current version 11.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

在项目目标/构建阶段/添加新构建阶段/添加复制文件构建阶段并将所有动态库复制到我的应用程序包中。

效果很好,我可以看到这些库位于应用程序包中。

然后将@rpath/../Libraries/ 添加到构建设置/运行路径搜索路径

但仍然收到错误消息..

ld:找不到 -lMagickWand-6.Q16.2 的库 clang:错误:链接器 命令失败,退出代码为 1(使用 -v 查看调用)

如果我添加直接路径,可以说库位于 /User/username/libs/ 到构建设置中的库搜索路径。

我错过了什么吗?

【问题讨论】:

【参考方案1】:

Content/Libraries 不是 app bundle 中的标准目录;请改用Contents/Frameworks(该目录中允许.dylibs 与.frameworks 相同)。

将每个库的安装名称设置为@rpath/libWhatever.dylib,并将可执行文件(在Contents/MacOS中)的运行路径搜索路径设置为@loader_path/../Frameworks。 p>

对于库相互依赖关系,Runpath Search Path 需要简单地为 @loader_path,以便可以从同一目录加载依赖库。

编辑:人们可能会发现this repo 中的copy_dylibs.py 脚本对于将第三方.dylibs 复制到App Bundle 中很有用。它递归地寻找需要复制的库,并更正这些库的安装名称,并对它们进行代码签名。

【讨论】:

你的意思是一个库它自己的路径应该是@rpath/libMagickCore-6.Q16.2.dylib 并且对于相同的库依赖路径应该是这样的@loader_path/../Frameworks/a .dependency.dylib?对不起,有点困惑。 @mohacs 所有库的 Install Name 在 Xcode 中构建时应为 @rpath/$(EXECUTABLE_PATH),在使用 install_name_tool 更改时应为 @rpath/libWhatever.dylib。将@rpath 视为与$PATH 相同,用于命令行上的可执行文件;它只是告诉加载器在哪里可以找到它正在寻找的库。 谢谢,现在基本上说找不到库(没有测试机器库不存在)不会抛出错误,但是即使在开发机器上,当我将 @loader_path/../Frameworks 放入运行路径搜索时调用任何库方法的路径什么都不做。如果我删除运行路径并将库路径添加到常规库搜索路径,它就可以工作。我仍然缺少一些东西。我是否应该始终保持常规库搜索路径 /Users/username/Desktop/lib2.否则它不会编译。我需要添加一个标志或类似的东西吗? 好的,你的解决方案是 %100 正确的,它一开始没有用,但我发现我之前编译的库有问题。重新编译库并像魅力一样工作。放置到 ../Frameworks 的所有库和应用程序都可以在每台计算机上运行。再次感谢。 Content/Frameworks 的回答中排名靠前? Apple 的所有文档都参考了Contents/Frameworks

以上是关于Xcode 5 如何从 App Bundle 链接动态库的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 5 - -bundle_loader 只能与 -bundle XCTest 一起使用

通过 Catalyst 工具 Xcode 11 从 Bundle for MacOS App 加载 WKWebView 中的 PDF

如何设置 Bundle Ids、App Identifiers 和 Provisioning Profiles 以发布使用 SwiftUI 和 XCode 制作的 WatchOs 应用程序?

Xcode生成静态库和bundle

iPhone Xcode Settings.bundle Plist 帮助

iPhone Xcode Settings.bundle Plist