在iPhone SDK 4中定位多个平台

时间:2010-07-01 18:51:24

标签: iphone linker

我有一个iPhone SDK项目,它应该为模拟器和ARM处理器构建一个静态库,然后将它们组合成一个通用库。

到目前为止,我使用iPhone SDK 3+并通过为每个,一个模拟器和一个ARM创建一个单独的目标,然后制作第三个使用shell脚本组合它们的目标来实现这一目标。每个组成目标的部署目标/构建设置都设置为各自的体系结构等。此外,iPhone SDK 3+允许我从主XCode左上角的下拉菜单中选择“Base SDK”窗口。

一切都很有名 - 然后我升级到SDK 4。

现在,左上角的下拉菜单中没有“Base SDK”列表。此外,编译器似乎完全忽略了目标部署设置。即使其中一个目标设置为“iPhone设备”而另一个设置为“iPhone模拟器”,它们仍然可以按照下拉菜单中的设置进行构建。

如果我不够清楚,这里是冒犯冒犯我们都知道和喜爱的上述菜单:

offending menu

再一次,在SDK 3中,一切都很完美。现在在SDK 4中,如果它设置为“Device”,我会得到两个为ARM构建的库。如果它设置为模拟器,我会为模拟器构建两个库。

有人知道这个bullhonkey的解决方法吗?

非常感谢。

更新:“xcodebuild”命令行工具仍然有效,也就是说它将根据每个目标的部署参数构建正确的体系结构。

因此,我可以使用一个调用xcodebuild的shell脚本,而不是使用XCode的GUI来构建:

xcodebuild -target device-target -configuration Debug
xcodebuild -target sim-target -configuration Debug

找到一个真正的解决方案仍然很好,但现在这将完成工作。

3 个答案:

答案 0 :(得分:3)

是的,Apple似乎正在嘲笑所有XCode控件和选项。如果我接近完成一个应用程序,我就不会安装Beta SDK或GM / public SDK。我知道升级会破坏某些东西。

无论如何,您应该能够创建一个外部目标或Shell脚本目标,构建每个目标或链接库。我的bag-o-tricks库有一个类似的shell脚本。在XCode项目设置中,我已将BaseSDK设置为iPhone Device 4.0 SDK。构建脚本看起来大致如下:

xcodebuild -parallelizeTargets -configuration Debug -sdk iphoneos4.0 -target StaticLibs
xcodebuild -parallelizeTargets -configuration Debug -sdk iphonesimulator4.0 -target StaticLibs
xcodebuild -parallelizeTargets -configuration Release -sdk iphoneos4.0 -target StaticLibs
xcodebuild -parallelizeTargets -configuration Release -sdk iphonesimulator4.0 -target StaticLibs
mkdir -p build/Debug-dist build/Release-dist
lipo build/Debug-iphoneos/libfoo.a build/Debug-iphonesimulator/libfoo.a -create -output build/Debug-dist/libfoo.a
lipo build/Release-iphoneos/libfoo.a build/Release-iphonesimulator/libfoo.a -create -output build/Release-dist/libfoo.a

好吧,我承认,这是一个展开的版本。我的实际脚本有一堆for thing in ${LIST_OF_STUFF}; do ...循环,可以更好地自动化构建,复制所有包含文件,并汇总整个SDK。

我提交了patch to Core-Plot来自动为他们创建SDK。如果您使用此修补程序作为参考,请从SDKSettings.plist中删除GCC_VERSION键/值对,否则构建的应用程序将失败。

答案 1 :(得分:1)

据我了解,设置中的“Base SDK”应该是SDK中最高的,而“iPhone OS部署目标”(也在设置中)应该是您需要的最低值。

因此,例如,如果您要为iPhone OS 3.1.2及更高版本编译应用程序,则必须将“Base SDK”设置为4.0,将“iPhone OS部署目标”设置为3.1.2。 / p>

答案 2 :(得分:0)

在iPhone sdk 4.0上,苹果删除了低于3.2的每个iOS版本。如果你为iPhone构建,它会自动构建为4.0,如果你为iPad构建,它将编译为3.2。

相关问题