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 项目的情况下,如果不做一个非常大的教程,我能说的不多
我找到了一个我想在我的 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 项目的情况下,如果不做一个非常大的教程,我能说的不多