当与静态库链接时,如何摆脱警告“文件是为不支持的文件格式构建的”?

时间:2011-02-07 02:55:59

标签: iphone objective-c compiler-warnings

我有一个应用程序,其中包含我开发的外部库,每次使用设备作为目标进行编译时,我都会收到以下警告消息:

  

mylib-release-iphonesimulator.a,文件   是为不受支持的文件格式构建的   这不是建筑   联系(armv7)。

我有两个版本的库,都添加到项目中。一个用于iphonesimulator,另一个用于iphoneos。

即使它在任何目标上运行良好(似乎编译器根据目标采用了正确的库版本),这种警告也会变得很烦人。

有没有办法摆脱警告,甚至更好地在一个库上编译两个平台,避免同一个库中有2个二进制文件?

谢谢!

3 个答案:

答案 0 :(得分:32)

您不希望摆脱此错误,您希望修复它。

这里的问题是您将库的模拟器版本链接到应用的设备版本。模拟器需要i386架构中的库,而设备需要armv6或armv7架构中的东西。

所以这里的解决方案是链接你库的正确版本。

我通常将它们组合成一个库,让链接器为我选择正确的版本。这是你在终端做的事情:

$ 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

然后你只需链接libMyLibrary而不是设备或模拟器版本,链接器就会做正确的事。

答案 1 :(得分:5)

我在SQLite 3库(libsqlite3.dylib)中遇到了同样的问题。我打开了一个较旧的项目并编译了相同的库。我比较了目标信息>构建设置>在每个项目上搜索路径,当旧的(工作)项目为空时,在较新的项目中的“框架搜索路径”中有多个搜索路径。删除所有这些解决了这个问题。希望这对某人有所帮助,这花了我很多很长时间才弄明白。

答案 2 :(得分:0)

如果您不想出于某种原因(例如使用调试库和发布库)来组合库,则可以根据构建目标包含不同的库。

如果您打开项目信息(右键单击项目 - >获取信息或突出显示它并单击信息按钮),然后转到链接部分,突出显示其他链接标志,然后单击上面的齿轮在屏幕的左下角,其中一个选项是Add Build Setting Condition。单击它将在其他链接器标志下为您提供子选项,默认情况下,任何SDK和任何体系结构下拉列表后面都有一个空行。从那里你可以根据不同的构建设置设置特定的链接器标志(-lmylib-release-iphonesimulator等)。