错误:ld:警告:忽略文件libfile01.a,该文件是为不是链接的架构(armv7)而构建的存档文件:libfile01.a

3
我是一名有用的助手,可以为您翻译文本。
我正在尝试为iOS设备编译一个用C语言开发的项目。它使用自定义库文件 libcurl、libcrypto、libssl 和 libpthread。我已经成功地为Mac OS X编译了它,但在为iOS编译时遇到了问题。此外,我在网上寻找的任何帮助都更多是关于Xcode GUI的帮助,而我需要的是命令行的帮助。需要通过命令进行编译,而不是使用Xcode GUI。
首先,需要编译几个C文件,然后将这些编译后的文件制作成一个静态库文件,在编译本地二进制文件时进一步使用。
以下是我如何从文件01中的C文件生成iOS arm输出文件的方法:
将iphoneos sdk路径存储在环境变量中:
CC="$(xcrun --sdk iphoneos9.2 --find clang) -isysroot $(xcrun --sdk iphoneos9.2 --show-sdk-path) -arch armv7 -arch armv7s -arch arm64 -arch armv6 -arch arm64"

使用以下命令编译file01中的c文件:

$CC -c -O2 *.c

可以使用lipo命令检查这些文件是为哪种架构编译的。例如:

$ lipo -info example_file01.o 
Architectures in the fat file: example_file01.o are: armv7 armv7s armv6 arm64

为了制作静态库文件,我可以使用以下命令获取iOS ar文件路径:
$ xcrun --sdk iphoneos9.2 --find ar /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar

我本来想将路径存储在环境变量中,但是出现了错误,无法识别ar命令参数rcu。因此,我使用ar路径来创建库文件,使用以下命令:

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar rcu ../output/libfile01.a *.o

如果检查该库文件支持哪些架构,它将给出以下输出:
$ lipo -info ../output/libfile01.a 
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: archive with no architecture specification: ../output/libfile01.a (can't determine architecture for it)

但是,它应该生成类似于以下输出的结果:
$ lipo -info ../ios/lib/libcurl.a 
Architectures in the fat file: ../ios/lib/libcurl.a are: i386 armv7 armv7s x86_64 arm64

使用生成的静态库文件编译文件时,尝试使用以下命令会导致错误:

$CC -o ../output/FinalProjectFile -O2 *.c ../output/libfile01.a ../ios/lib/libcurl.a ../ios/lib/libssl.a ../ios/lib/libcrypto.a -lpthread -lm

Error: ​ld: warning: ignoring file ../output/libfile01.a, file was built for archive which is not the architecture being linked (armv7): ../output/libfile01.a​

感谢您的帮助。

好的,有人能告诉我如何将一组C程序编译为静态.a库文件,以便我可以在iOS设备上使用吗?我可以使用以下命令在OS X上构建相同的内容:gcc -c -O2 *.c jpeg/*.c jpeg/unix/*.c && ar rcu ../agents/libcrypto777.a *.o,但这对于iOS不起作用,并且我遇到了问题,就像问题中所解释的那样。 - satinder
1个回答

2

我通过使用不同的参数ar最终解决了这个问题。

与其使用

$ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar rcu ../output/libfile01.a *.o

已使用

$ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ar -rcs ../output/libfile01.a *.o

唯一的区别是它使用-rcs而不是rcu。 检查此库文件的信息时,它显示的输出如下:
$ lipo -info ../output/libfile01.a 
Architectures in the fat file: ../output/libfile01.a are: armv7 armv7s armv6 arm64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接