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

Die*_*sta 14 iphone objective-c compiler-warnings

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

mylib-release-iphonesimulator.a,文件是为不支持的文件格式而构建的,而不是被链接的体系结构(armv7).

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

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

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

谢谢!

Dav*_*ong 33

你不想摆脱这个错误,你想要解决它.

这里的问题是您将库的模拟器版本链接到应用程序的设备版本中.模拟器需要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
Run Code Online (Sandbox Code Playgroud)

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


ava*_*nce 5

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