Xcode静态库似乎改变了构建

时间:2017-06-14 06:11:44

标签: c++ ios iphone xcode

在我深入研究这个问题之前,这里有一些背景知识。我的最终目标是为架构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构建设置中是否有可能出错? 感谢您抽出宝贵时间阅读我的问题

1 个答案:

答案 0 :(得分:0)

我猜这个框架不是为iOS模拟器的架构编译的,它是i386。 Xcode只为目标架构编译框架。

请按照本教程:http://www.raywenderlich.com/65964/create-a-framework-for-ios

这可能会有所帮助。