我对iOS / iPhone / XCode世界完全陌生,所以如果你猜的是介于相当复杂的东西和非常简单的每个人应该知道的东西之间,我会选择简单的答案。 : - )
好的,所以我继承了一个我们外包给另一家公司的iPhone项目。我现在唯一的目标是能够建立当时的事情。我设置了XCode 4.2并安装了适当的SDK。我加载了这个项目,到目前为止一切似乎都很好。但是,当我构建时,我会从我认为构建的链接阶段中得到错误。我不完全确定,因为建筑时状态会迅速改变。我得到的错误如下:
从我在网上找到的内容来看,我使用的其中一个库似乎没有为i386平台编译。首先,这对我来说没有意义,因为我正在使用的库(这些错误来自哪里)目前作为子项目包含在内,并生成我认为是拱形的 .a 文件 - 独立(我在这里错了吗?)。此外,我在项目中找不到任何指示XCode构建i386架构的项目。这就是我到目前为止所做的:
主要项目配置
子项目配置
当我使用发布配置构建时,我仍然会收到此错误,但我不确定原因。我在构建配置中查看的所有内容似乎都表明我应该在 arm 架构中构建所有内容。
答案 0 :(得分:3)
您收到错误是因为您搞乱了架构设置。您不应该将这些修复为ARM代码,但也允许使用i386。
现在,您的一个(子)项目只构建ARM代码,一旦您尝试构建模拟器版本,就会导致链接器错误。这种情况正在发生,因为您的架构设置并非如此。
请注意 任意iOS SDK 的设置,因为它只构建ARM代码,因此不正确。选择特定设置(单击)后,使用键盘上的退格键完全删除这些设置。
这应该是这样的:
在构建特定于设备的代码时, $(ARCHS_STANDARD_32_BIT)
会解析为ARMV7
,而在构建模拟器特定代码时,i386
会解析为ARMV6
。如果您计划将结果提供给较旧的iOS设备(iPhone 3G及更低版本),则只需根据我的屏幕截图包含LIPO
代码。
一旦这些设置在所有(子)项目中处于活动状态,一切都应该顺利进行。
要从项目中创建通用库,如果您计划将静态库分发给其他开发人员,请使用lipo input_library_1.a input_library_2.a -create -ouput output_library.a
。
示例:
i386
让我们说input_library_1是ARM
特定的(模拟器)而input_library_2是{{1}}特定的(设备),这会将它们加入到可用于模拟器和设备的通用版本中。
答案 1 :(得分:0)
似乎您一直在尝试链接到为设备构建的静态库(armv6或armv7)。当您为模拟器构建时,架构将是i386。所以你得到了所有这些讨厌的链接错误。解决方案是在项目中包含为模拟器编译的库。