Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get rid of the warning "file was built for unsupported file format" when linking with a static library?

I've an application which includes an external library I developed, and I'm getting the following warning message every time I compile using the device as target:

mylib-release-iphonesimulator.a, file was built for unsupported file format which is not the architecture being linked (armv7).

I've 2 versions of the library, both added into the project. One built for the iphonesimulator and the other for iphoneos.

Even though it works well on any target (seems the compiler takes the correct version of the library depending of the target) that sort of warning becomes anoying.

Is any way to get rid of the warning, or even better compile both platforms on a single library avoiding to have 2 binaries of the same library?

Thanks!

like image 456
Diego Acosta Avatar asked Feb 07 '11 02:02

Diego Acosta


People also ask

Why does my Google Drive say unsupported file type?

If your file type is not supported, it means that the file cannot be converted to a Google Doc, and cannot be viewed in Google Doc viewer. However, unsupported files can be stored in Google Drive in their original format, and opened using a third-party extension or local application.

How do I fix unsupported files on my iPhone?

If you have a video file with an unsupported extension, you have two options. You can convert your file on your computer using video conversion software, and send it to your iPhone again. Or, you can download a third-party media player app like VLC from the App store (recommended).


1 Answers

You don't want to get rid of this error, you want to fix it.

The problem here is that you're linking a simulator version of your library into the device build of your app. The simulator wants libraries in the i386 architecture, and the device wants things in the armv6 or armv7 architecture.

So the solution here is to link the correct version of your library.

What I usually do is combine them into a single library and let the linker pick the right version for me. Here's what you do in Terminal:

$ cd /path/to/my/libraries
$ ls 
  libMyLibrary-Device.a
  libMyLibrary-Simulator.a
$ file libMyLibrary-Device.a
  libMyLibrary-Device.a: Mach-O universal binary with 2 architectures
  libMyLibrary-Device.a (for architecture armv6):   current ar archive random library
  libMyLibrary-Device.a (for architecture armv7):   current ar archive random library
$ file libMyLibrary-Simulator.a
  libMyLibrary-Simulator.a: Mach-O universal binary with 1 architecture
  libMyLibrary-Simulator.a (for architecture i386): current ar archive random library
$ lipo -create -output libMyLibrary.a libMyLibrary-Device.a libMyLibrary-Simulator.a
$ ls
  libMyLibrary-Device.a
  libMyLibrary-Simulator.a
  libMyLibrary.a
$ file libMyLibrary.a
  libMyLibrary.a: Mach-O universal binary with 3 architectures
  libMyLibrary.a (for architecture armv6):  current ar archive random library
  libMyLibrary.a (for architecture armv7):  current ar archive random library
  libMyLibrary.a (for architecture i386):   current ar archive random library

Then you just link libMyLibrary instead of the device or simulator version, and the linker will do the right thing.

like image 122
Dave DeLong Avatar answered Oct 10 '22 05:10

Dave DeLong