Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Xcode: Conditional Build Settings based on architecture (Device (ARM) vs Simulator (i386))

I'm building an iPhone app that has to run on both the simulator and the device. However I'm using an externally compiled library that has one version for the simulator and one for the device (different CPU).

How can I do it? I'm coming from Visual C++ so I'm new to Xcode, and I can't find the way to do it.

EDIT, March 2016: this question was asked on July 2009, almost 6 years ago. Much has changed in Xcode since, but I guess some stuff still holds. The now-accepted answer, for example, wasn't an option in Xcode v3.

like image 984
noamtm Avatar asked Jul 31 '09 10:07

noamtm


2 Answers

I had this problem when integrating Adobe Omniture's "AppMeasurement" library, which currently comes compiled for 3 architectures: libAppMeasurement-iOSSimulator.a, libAppMeasurement-iOSDevice.a, and libAppMeasurement-iOSDevice-armv7.a.

While the other answers here are substantially correct, I ended up having to go elsewhere to truly understand and then fix the problem.

Step 1. Understanding the issues

This blog post does a great job of explaining the overall issue. It gives start-to-finish instructions for solving the problem in Xcode 3. See below for Xcode 4.

Note: You might try skipping the bit where he says to add the static libraries and then delete them. The next time I do this, I'll probably just add the header file(s), then skip straight to editing Other Linker Flags.

Step 2. Conditional Build Settings in Xcode 4

This StackOverflow page explains the new way to set conditional build settings in Xcode 4. Tip: The text fields on the Build Settings tab are drag-&-drop enabled; once you have your conditional build setting ready for editing under Other Linker Flags, you can just drag the static library file right onto the text field and Xcode will automatically enter a (hopefully relative) path.

Here's a screenshot of my Other Linker Flags once I got the "missing required architecture i386" warning to go away with no build errors:

enter image description here __

like image 104
clozach Avatar answered Oct 05 '22 17:10

clozach


You have 3 options:

  1. If you control click on the name of build setting inside the Inspect Window (where you can change compiler settings, etc) it will bring an option to conditionalize that setting. Just go to the linker flags you want to change, and conditionalize them by SDK, then enter the specific library for each SDK.

  2. Alternatively you can take the library and install it at the same path in each SDKs root ("/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/" and "/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk/usr/lib"). Since SDK relative library search paths are used the appropriate version will be pulled in for either build.

  3. You can lipo together two libraries into one fat library. That is probably a bad idea, but if you want to do it checkout the manpage.

like image 43
Louis Gerbarg Avatar answered Oct 05 '22 19:10

Louis Gerbarg