为 iOS 编译 C 源代码

Compiling C Source for iOS

我有一些用 C 编写的现有源代码,我想将其构建并包含在我的 iOS 项目中。整个源码包非常大,是使用现有的 Makefiles 和 GCC 构建的。它正在生成静态库(.a 文件),我很乐意将其转移到我的 iOS 项目中。但是,Makefile 生成的静态库是针对 x86 处理器的,这显然不适用于 iOS.

有没有一种方法可以将 GCC 切换为为 ARMv7/ARM64 构建,而不更改现有源代码(在大多数情况下)?我知道 GCC 有 -march 开关,或者您可以下载特定于 ARM 的 GCC 编译器,所以我知道为不同于构建机器的架构构建的一般概念。

要在 Mac OS 上构建 ARM,我是否必须下载不同的 GCC 编译器,或者该功能是否内置于默认 GCC 中?

很抱歉对这里的基本概念缺乏理解;我主要是一名 Java 和 Objective-C 开发人员,因此为不同的架构构建源代码对我来说是一个很陌生的概念。

虽然 GCC 支持很多 CPU 体系结构和平台,但它通常是为单个体系结构和平台构建的。要为 ARM 进行编译,您通常需要适当定位的 ARM 交叉编译 GCC。

所有架构的 MacOSX 和 iOS 的默认系统编译器是 clang 并且已经有一段时间了(最新版本的 GCC apple 在开发工具已经过时了,而且肯定不支持 ARMv8)。

获得clang的通常方法是安装Xcode(从App Store免费)。安装程序(以及 Xcode 的 UI 中)有一个选项可以安装命令行工具包。这会将 /usr/bin 中的符号链接安装到编译器,并安装一堆您可能期望的其他东西,例如 make

clanggcc(大部分)命令行兼容,此外,您会发现如果您从命令行 运行 gcc在安装了开发工具的 Mac 上,你实际上得到了 clang。

$ gcc --version
Configured with: --    prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.0.0
Thread model: posix 

clang 附带 ARMv7、ARMv8、i686,x86_64 在 MacOSX 上,并且可以配置为从命令行编译其中任何一个(参见 documentation)

鉴于上述情况,您的代码很可能会使用现有的 makefile 对编译器标志进行最少的更改进行编译。您可能想阅读 lipo 的文档 - 它允许您生成多体系结构二进制文件。