【问题标题】:Compiling C Source for iOS为 iOS 编译 C 源代码
【发布时间】:2015-02-04 14:04:46
【问题描述】:

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

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

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

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

【问题讨论】:

  • OS X 不再附带 GCC。它带有clang,并且clang 确实支持交叉编译到iOS。事实上 - 只需将 .c 文件放到您的项目中,与您放置 .m 文件的位置相同。它们将与 Objective-C 代码一起编译得很好(请记住,Objective-C 是 C 的适当超集。如果您可以交叉编译 Objective-C,那么您也可以交叉编译 C。)

标签: ios c gcc arm cross-compiling


【解决方案1】:

虽然 GCC 支持许多 CPU 架构和平台,但它通常是为单一架构和平台构建的。要为 ARM 进行编译,您通常需要一个针对适当目标的 ARM 交叉编译 GCC。

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

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

clang(大部分)命令行与gcc 兼容,此外,如果您在安装了开发工具的Mac 上从命令行运行gcc,实际上您铿锵声。

$ 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 在 MacOSX 上随 ARMv7、ARMv8、i686、x86_64 一起提供,并且可以配置为从命令行编译任何这些(请参阅 documentation

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

【讨论】:

  • 谢谢马尔科!我能够准确地确认您在发帖之前提到的自己(无论如何都感谢您的确认!)。我经历并用'xcrun -sdk iphoneos clang -arch armv7'替换了'/bin/gcc',并且能够为arm编译所有内容。我知道有一种方法可以制作一个通用库,我接下来会做,并将 armv7、arm64 和 x86 库组合在一起。
  • @Dan 我一直在寻找那个命令。谢谢! xcrun -sdk iphoneos clang -arch armv7 main.c
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多