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
(该目录中允许.dylib
s 与.framework
s 相同)。
将每个库的安装名称设置为@rpath/libWhatever.dylib
,并将可执行文件(在Contents/MacOS
中)的运行路径搜索路径设置为@loader_path/../Frameworks
。 p>
对于库相互依赖关系,Runpath Search Path 需要简单地为 @loader_path
,以便可以从同一目录加载依赖库。
编辑:人们可能会发现this repo 中的copy_dylibs.py
脚本对于将第三方.dylib
s 复制到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 应用程序?