如何在XCode中为iPhone连接不同的预编译库以适用于不同的构建配置?

9
我的客户提供给我两个预编译库,blah-device.a 和 blah-simulator.a。我该如何让 Xcode 在设备编译模式下使用 blah-device.a,在模拟器编译模式下使用 blah-simulator.a?
我的客户给了我以下指示:
  1. 打开目标组(在“组和文件”面板中),右键单击项目图标,然后选择“添加”>“现有框架”。
  2. 在链接库部分,点击添加库(+)图标,然后点击添加其他。
  3. 选择 blah-device.a(用于直接在 iPhone 设备上开发)或 blah-simulator.a(用于在 iPhone 模拟器上开发),然后点击添加。
我已经将头文件复制到其中,但这些说明并不方便使用不同的配置进行构建。
当使用 DEVICE 配置文件进行构建时,如何让 Xcode 链接 blah-device.a,而在使用 SIMULATOR 配置文件进行构建时链接 blah-simulator.a?
非常感谢您的帮助。
4个回答

17

以后处理这样的情况的一个好方法是将不同架构的.a文件合并成一个文件,然后在XCode中引用它。你可以使用lipo命令行工具来完成此操作:

lipo libx.a liby.a -create -output libz.a

例如,如果libx.a是armv6和armv7,而liby.a是i386,则生成的库libz.a将包含armv6、armv7和i386。

您还可以通过lipo -info命令检查.a文件。

希望这可以帮助您。 :)


如果设备和SIM卡是相同的架构(即在M1上),则它将无法工作。 - esp

7

有一种更简单的方法可以做到这一点。您可以在一个目标下复制“Library Search Paths”,并为每个目标设置不同的架构。然后,您可以为模拟器和设备设置不同的路径。


在Xcode 10中,模拟器下应选择Any iOS Simulator SDK,真机测试应选择Any iOS SDK - CyberMew

2
最简单的方式是通过复制现有的目标来创建两个独立的目标。将其中一个命名为“Foo Device”,另一个命名为“Foo Simulator”。然后在XCode中右键单击blah-device.a,选择Targets选项卡,确保“Foo Device”目标已经打开而“Foo Simulator”目标已经关闭。
对于balah-simulator.a也是同样操作,但这一次“Foo Device”目标应该关闭而“Foo Simulator”目标应该打开。
现在,每当你想进行模拟器构建时,请确保从Active SDK弹出窗口中选择Simulator,并从目标弹出窗口中选择“Foo Simulator”。对于设备测试,请选择Device并选择“Foo Device”目标。

谢谢!有没有不需要另一个目标,只使用XCode配置文件构建设置来完成这个任务的方法? - CVertex
问题在于如果blah-device.a和blah-simulator.a都导出了相同的符号。解决这个问题的一种方法是在头文件中基于#if TARGET_IPHONE_SIMULATOR进行测试,并将Foo定义为预处理器宏以区分FooDevice与FooSimulator。然后,您可以包含两个库并链接正确的符号。但是,如果这两个库都包括相同的链接器符号,则会出现重复符号错误。在这种情况下,唯一的方法是在一个情况下排除一个符号链接而另一个情况不排除。您可以调整链接器路径值,但使用多个目标要容易得多。 - Ramin

2

你可以为不同的库使用不同的链接路径。 链接路径


在Xcode 10中,模拟器下是Any iOS Simulator SDK,而真机下是Any iOS SDK - CyberMew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接