C代码可以编译成任何架构的静态库吗?

Can C code be compiled into a static library for any architecture?

我找到了一个我想在我的 iOS 项目中使用的 C 库。

库附带一个 makefile,可以将源代码编译到 .a 存档中。当我对结果 .a 运行 lipo archs 时,不包括 iOS 所必需的 arm64

如果我手动将所有 C 源代码和头文件放入我的 iOS 项目中,所有内容都会编译并 link。然而,这是一个笨拙的解决方案,因为它向我的主项目和库添加了数百个文件,但似乎无论如何都无法正常工作。

如果我尝试在 Xcode 中创建一个新的 iOS 静态库项目并将所有 C 源代码和头文件放入其中,我会得到每个结果的构建错误 .o文件类似:Building for iOS, but the linked item '<item>.o' was built for macOS.

我是不是在尝试做一些不可能的事情?什么本质上决定了 C 源代码可以构建的兼容架构?

动态库和静态库都反映了目标CPU,只是来自cc -c的.o目标文件的集合,但当然你必须有编译器并将其定向到目标CPU.您不必 运行 成为目标 CPU。对于每个目标,您需要制作特定的 .o、.a、.so 或 .dll 或他们称之为对象和库文件的任何内容。对于相同的 CPU,OS 之间可能存在交叉兼容性。这取决于目标 OS 的链接器和加载器。我们已经在各种 x86 OS.

的 COFF 和 ELF 文件中看到了这一点

高度优化的代码只能在正确的目标 CPU 上完全实现,并且可能在正确的目标 OS 上实现,尽管它可能 运行 在其他兼容系统上很好。

所有这些都是可能的,但是如果不看您的代码就有点困难。

这是一个小开场白:

clang -c library.c -o library.x86_64.o -arch x86_64 // Compile your code to x86_64
clang -c library.c -o library.arm64.o -arch arm64 // Compile your code to arm64
libtool -static -o library.x86_64.a library.x86_64.o // Create a static intel lib
libtool -static -o library.arm64.a library.arm64.o // Create a static arm64 lib
libtool -static -o library.a library.x86_64.a library.arm64.a // Create a universal static lib

在不了解您的 makefile 或您的 Xcode 项目的情况下,如果不做一个非常大的教程,我能说的不多