在我深入研究这个问题之前,这里有一些背景知识。我的最终目标是为架构arm64,armv7,armv7s,i386和x86_64编译c ++静态库的源代码,然后将库打包到一个胖库中,以便我可以在iOS开发期间使用它们。这将使我能够使用模拟器和具有相同库的设备。
这是我的问题。我试图使用iPhone 5模拟器测试i386版本的库。我为i386编译了静态库,如下所示:
./configure --enable-utf8-only --disable-shared --host=i386-apple-darwin LDFLAGS="-L." CC="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang" CXX="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++"
然后
make CXXFLAGS="-arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.3.sdk" CCFLAGS="-arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator10.3.sdk"
这导致我的静态库libtest.a
。然后我运行了以下来验证库架构
jamespc:Desktop $ lipo -info libtest.a
input file libtest.a is not a fat file
Non-fat file: libtest.a is architecture: i386
到目前为止,一切似乎都很好看。接下来,我将库添加到我的Xcode项目并尝试构建项目。在构建项目时,我收到以下警告和错误。
ld: warning: ignoring file
/Users/cleandev/Library/Developer/Xcode/DerivedData/MyProject-hjtfdovfmdsubkejojqknkmqkzps/Build/Products/Debug-iphonesimulator/libtest.a,
file was built for archive which is not the architecture being linked (i386):
/Users/cleandev/Library/Developer/Xcode/DerivedData/MyProject-hjtfdovfmdsubkejojqknkmqkzps/Build/Products/Debug-iphonesimulator/libtest.a
Undefined symbols for architecture i386:
...
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
因错误而感到困惑我再次在静态库上运行了lipo,这次使用了派生数据文件夹中警告中列出的路径。
jamespc:Debug-iphonesimulator $ lipo -info libtest.a
input file libtest.a is not a fat file
Non-fat file: libtest.a is architecture: x86_64
当我在派生数据中查看它时,我很困惑为什么库看起来与其关联的架构不同。
我编译静态库的方式是错误的吗? 我的Xcode构建设置中是否有可能出错? 感谢您抽出宝贵时间阅读我的问题
答案 0 :(得分:0)
我猜这个框架不是为iOS模拟器的架构编译的,它是i386。 Xcode只为目标架构编译框架。
请按照本教程:http://www.raywenderlich.com/65964/create-a-framework-for-ios
这可能会有所帮助。