【发布时间】:2016-07-22 20:26:02
【问题描述】:
我正在将一个较大的 iOS 应用拆分成几个框架,我面临以下问题:
如何正确地将自定义 Cocoa Touch 框架项目包含到 iOS 应用项目中,以便所有内容都能正确链接?
- 我创建了一个项目框架,其中包含所有必要的代码。
- 为了进行测试,我创建了一个示例工作区,并将框架项目添加到其中。
- 接下来,我创建了一个示例 iOS 应用项目,其中包含几行使用框架的代码,并将该项目也添加到了工作区。
现在,我进入链接部分。
第一次尝试:
在 Xcode 中打开应用目标设置,选择
Info窗格,然后在Linked Frameworks and Libraries部分添加框架。为了好看,我还在app项目中选择了新添加的框架,将
Location从Relative to Group改为Relative to Build Products。位置下方显示为../Debug-iphonesimulator/MyFramework.framework-
当前方案是
李><Simulator, Debug>,我点击了Run,并且一切正常 - 应用程序记录它正在使用框架正常。 现在,我清理构建文件夹,并将方案更改为
<Simulator, Release>。接下来,我点击
Run,项目开始构建,然后应用链接失败:
Undefined symbols for architecture x86_64: <a function from the framework> referenced from: <a file in the app>.
在检查 build 文件夹时,我可以看到框架已正确构建,位于 .../Build/Products/Release-iphonesimulator/...,并且是一个包含 i386 和 x86_64 的胖二进制文件。
我应该如何继续正确链接框架,以便它在任何配置(调试、发布)以及模拟器和设备上都能正常工作?
为了澄清,我打算同时开发框架和应用程序,所以像这样的解决方案。 CocoaPods 通过预先构建胖框架一次来做到这一点,似乎不太实用(除非我错过了一些东西,因为缺乏足够的 CocoaPods 经验)。
下面是失败的Link 相位输出:
Ld /Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Intermediates/MyApp.build/Release-iphonesimulator/MyApp.build/Objects-normal/x86_64/MyApp normal x86_64
cd /some/where/here/lives/the/workspace
export IPHONEOS_DEPLOYMENT_TARGET=9.3
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++
-arch x86_64
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk
-L/Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Products/Release-iphonesimulator
-F/Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Products/Release-iphonesimulator
-filelist /Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Intermediates/MyApp.build/Release-iphonesimulator/MyApp.build/Objects-normal/x86_64/MyApp.LinkFileList
-Xlinker
-rpath
-Xlinker @executable_path/Frameworks
-mios-simulator-version-min=9.3
-Xlinker
-objc_abi_version
-Xlinker 2
-fobjc-arc
-fobjc-link-runtime
-stdlib=libc++
-framework MyFramework
-Xlinker
-dependency_info
-Xlinker /Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Intermediates/MyApp.build/Release-iphonesimulator/MyApp.build/Objects-normal/x86_64/MyApp_dependency_info.dat
-o /Users/me/Library/Developer/Xcode/DerivedData/MyWorkspace-ahzqvfgoxbedpudjdhtqudgqzwba/Build/Intermediates/MyApp.build/Release-iphonesimulator/MyApp.build/Objects-normal/x86_64/MyApp
Undefined symbols for architecture x86_64:
"SomeFancyFuncFromTheFramework()", referenced from:
-[AppDelegate application:didFinishLaunchingWithOptions:] in AppDelegate.o
【问题讨论】:
-
您是否在App的目标中添加了构建依赖以首先构建框架?
-
NSGod,我确实尝试过,但它只显示了一行 - 应用程序项目名称;没有什么可供选择的,也没有关于框架目标的任何内容。
-
MyApp_dependency_info.dat文件(来自最后一个-Xlinker参数)包含对MyFramework.framework/MyFramework.tbd和MyFramework.framework/MyFramework的引用,两者都在.../Build/Products/Release-iphonesimulator/中,据我所知(和FWIW)。 -
嗯,这很奇怪。我整天都在一个 iOS 应用程序上工作,我在做这件事,它工作正常,但现在我刚刚创建了 2 个快速测试项目,它似乎没有像它应该的那样工作(我没有像你一样列出任何东西当我尝试将框架目标添加为依赖项时)......不确定发生了什么......
-
好吧,终于让它工作了,虽然它需要一些工作。我退出了 Xcode 几次,当我重新打开项目时,情况似乎好了一些。打算从头开始,看看能不能再做一次......
标签: xcode ios-frameworks