我正在构建一个必须在模拟器和设备上运行的iPhone应用程序。但是我使用的是一个外部编译的库,它有一个版本用于模拟器,一个用于设备(不同的CPU)。
我该怎么办?我来自Visual C ++,所以我是Xcode的新手,我找不到办法。
编辑,2016年3月:这个问题是在大约6年前的2009年7月问的。 Xcode已经发生了很大的变化,但我猜有些东西仍然存在。例如,现在接受的答案不是Xcode v3中的一个选项。
答案 0 :(得分:28)
在集成Adobe Omniture的“AppMeasurement”库时遇到了这个问题,该库目前为3种架构编译:libAppMeasurement-iOSSimulator.a,libAppMeasurement-iOSDevice.a和libAppMeasurement-iOSDevice-armv7.a。
虽然这里的其他答案基本上是正确的,但最终我不得不去其他地方真正理解并解决问题。
步骤1.了解问题
这blog post很好地解释了整个问题。它为解决Xcode 3 中的问题提供了从头到尾的说明。请参阅下面的Xcode 4。
注意:您可以尝试跳过他说添加静态库的位,然后删除它们。下次我这样做时,我可能只是添加头文件,然后直接跳到编辑其他链接器标志。
步骤2. Xcode 4中的条件构建设置
此StackOverflow page解释了在Xcode 4中设置条件构建设置的新方法。提示:“构建设置”选项卡上的文本字段已启用拖放功能。一旦准备好在其他链接器标志下编辑条件构建设置,就可以将静态库文件直接拖到文本字段上,Xcode将自动进入(希望是相对的)路径。
这是我的其他链接器标志的屏幕截图,一旦我得到“缺少必需的架构i386”警告就会消失,没有构建错误:
__
答案 1 :(得分:9)
您有3个选项:
如果您控制点击Inspect窗口中的构建设置名称(您可以在其中更改编译器设置等),它将带来一个条件化该设置的选项。只需转到要更改的链接器标志,然后通过SDK对它们进行条件化,然后输入每个SDK的特定库。
或者,您可以使用该库并将其安装在每个SDK根目录中的相同路径中(“/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/”和“/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/usr/lib”)。由于使用了SDK相对库搜索路径,因此将为其中一个版本提供适当的版本。
您可以将两个库合并为一个胖库。这可能是一个坏主意,但如果你想这样做,请查看manpage。
答案 2 :(得分:5)
有人遇到警告,例如“[lib_for_sim_or_device]不是为体系结构构建的......”,将第三方库文件夹拖入项目时会出现警告。
在场景后面,XCode自动将库文件添加到'目标设置 - >建立短语 - >将Binary链接到Libraries的部分,这会导致与两个库的链接。
要解决此问题,请从“Link Binary with Libraries”中删除这些条目,然后按照上面有关sim / device'的条件构建设置的指南进行操作
希望它有所帮助!
答案 3 :(得分:3)
建议的方法是不将库添加到项目和目标中,而是将其他链接器标志设置为包含对每个配置的链接库的单独直接引用。
对于调试:
OTHER_LINKER_FLAGS = -l/Path/To/My/Debug/Library.dylib
发布
OTHER_LINKER_FLAGS = -l/Path/To/My/Release/Library.dylib
您当然可以使用对其他构建设置的引用来使这些路径相对于持久的东西,或者将源树用于外部源树。
答案 4 :(得分:1)
对于Xcode 3.2.1中的选项1(参见Louis Gerbarg答案),选择“Other Linker Flags”,然后从构建设置窗口左下角的下拉菜单中选择“Add Build Setting Condition”。请参阅“其他链接器标志”语法的cdespinosa答案
如果您将设备/模拟器库放在不同的目录中,也可以将“添加构建设置条件”添加到“库搜索路径”。
答案 5 :(得分:1)
其他链接器标志和添加库的问题是控制库的链接顺序,这可能很重要。似乎链接器标志版本意味着这些库将首先出现,所以如果您在xcode中管理其他必须首先出现的库,那么您必须放弃它并将所有内容移动到其他链接器标志......! - P
答案 6 :(得分:0)
在我的XCode 3.2.3中,正确的命名似乎是OTHER_LDFLAGS,而不是OTHER_LINKER_FLAGS。