在Xcode项目中包含第三方框架

时间:2014-11-28 20:24:05

标签: objective-c xcode macos taglib codesign

我很难将TagLib框架正确地包含在Xcode 6中的OS X Objective-C(++)项目中。最终,我的目标是让框架与我的应用程序包一起分发所以一切是完全独立的。既然我不确定自己哪里出错了,那就让我从一开始就做我迄今所做的事情。

我从GitHub抓取TagLib并将其构建到带有CMake的Framework中。这些是我使用的构建选项:

cmake -DCMAKE_BUILD_TYPE=Release \
-DBUILD_FRAMEWORK=ON \
-DCMAKE_OSX_DEPLOYMENT_TARGET=10.10 \
-DCMAKE_OSX_ARCHITECTURES="x86_64"

这些是我认为“可接受的最小值”,它们来自TagLib INSTALL自述文件。在makemake install框架结束后/Library/Frameworks。该框架在1.14.0内有Versions目录 - 这对我的一个问题很重要(我认为)。

在Xcode中创建项目之后,我接下来要做的是将框架添加到我的应用程序目标中的“Linked Frameworks and Libraries”。然后,我为我的应用程序和测试目标添加了一个新的“复制文件”构建阶段,将框架复制到bundle的Frameworks目录中。从那里,我将/Library/Frameworks/tag.framework/Headers添加到我的应用程序并测试目标的“用户标题搜索路径”。我做的最后一件事是将框架添加到我的测试目标的“Link Binary With Libraries”构建阶段。

此时,如果我没有任何编码,我的项目将会建立。但是,如果我尝试运行应用程序或测试,我会收到此错误(从路径中删除名称):

dyld: Library not loaded: /usr/local/lib/tag.framework/Versions/1.14.0/tag
Referenced from: /Users/.../Library/Developer/.../Build/Products/Debug...
Reason: image not found

dyld在那里找不到框架是完全合理的,因为它没有安装在那里。但为什么它首先在那里看?我的应用目标的“运行时搜索路径”为@executable_path/../Frameworks,我的测试目标包括@loader_path/../Frameworks

现在,如果我尝试对我的项目进行编码,我甚至无法构建它。我选择“Mac App Store”进行“签名”,选择我的“团队”配置文件,然后重新检查“复制文件”构建阶段的“代码登录复制”框,并对其进行编码签名:

/Users/.../Library/Developer/Xcode/DerivedData/.../Build/Products/Debug/.../Contents/Frameworks/tag.framework/Versions/A: No such file or directory
Command /usr/bin/codesign failed with exit code 1

同样,这条消息非常有意义,因为A内只有Versions目录 - 只有1.14.0Current符号链接。但为什么它一直在寻找A

所以,我最常见的问题是,如何将这个框架正确地包含在Xcode项目中,以便我可以1)没有外部依赖(即框架在bundle中)和2)使它具有协同作用?我的过程是我在SO和Apple开发者网站上阅读的事物的集合,但我不确定它是否接近正确。我见过的另一件事我没有尝试过使用“install_name_tool”和“otool”,但我不确定我需要更改什么或者使用哪两种工具。

非常感谢任何帮助或建议!

1 个答案:

答案 0 :(得分:2)

这是一个写得很好的问题。我在寻找问题的答案时遇到了它,这基本上是一回事。我想出了我的想法,并认为你走在正确的轨道上。

您确实需要修复框架的结构。不确定为什么事情的构建方式不同,但基本上,1.14.0目录应该是A,而Current应该是一个符号链接。这就是我所做的,处理那部分。其他人通过删除当前符号链接并将1.14.0目录移动到当前来破解它。我坦率地不知道为什么签名工具不会签署当前,按照符号链接,只是工作。我注意到构建设置下的框架版本有一个构建设置 - >设置为A的包装 - 也许它可以更改为Current或1.14.0?我踩了一下,然后将1.14.0移动到A并删除并重新创建了符号链接或当前 - > A(如果在框架/版本dir中,则为ln -s A Current)。

此时,我认为代码签名对您有用,并且您将在运行时回到其他问题。那是因为在构建时没有正确设置框架安装路径。有不同的选择,但最灵活的是更改框架的构建以使用@rpath作为安装位置,或者只是像我使用install_name_tool之后修复它。例如,如果你CD到包含tag.framework包的目录,

install_name_tool -id @rpath/tag.framework/Versions/A/tag tag.framework/Versions/A/tag 

如果要在构建之间更改这些内容,请确保在构建之前进行清理,除非您确定您对框架设置具有依赖性。 祝好运。这对我来说也很烦人。

标签库也应该更新他们的构建过程,我怀疑,虽然我从Apple读取框架文档的方式,我认为dir名称A,B等只是示例,而不是坚定的规则,并且真正的规则是,Current是一个符号链接,并且在指定的地方没有允许在特定事物之外的额外残余。

帮助我度过漫游路径的链接: https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/FrameworkAnatomy.html http://blog.gmane.org/gmane.comp.kde.devel.taglib/month=20081001/page=1 (以及上面的mikeash和driben链接! - 我目前无法发布2个以上的链接)