使用 Clang 而不是 gcc 在 OS X for iOS 上交叉编译 OpenSSL 时出错

Dru*_*rux 0 gcc openssl std clang ios

我想按照 WWDC 2014 会话 305 视频和 OpenSSL 网站中的说明在没有安装 gcc 的情况下在 OS X 上为 iOS 交叉编译 OpenSSL 1.0.1h。

我解压缩/解压,然后按照此处的建议从(几乎)切换gcc到。clang

OLD_LANG=$LANG
unset LANG

sed -i "" 's|\"iphoneos-cross\"\,\"llvm-gcc\:-O3|\"iphoneos-cross\"\,\"clang\:-Os|g' Configure
sed -i "" 's/CC= cc/CC= clang/g' Makefile.org
sed -i "" 's/CFLAG= -O/CFLAG= -Os/g' Makefile.org

export LANG=$OLD_LANG
Run Code Online (Sandbox Code Playgroud)

请注意,我必须坚持使用该makedepend工具,否则该make depend步骤将失败(正如其他地方也提到的)。安装该工具brew install makedepend对我来说不是问题(但在 Clang 旁边安装 gcc 会是)。现在

./Configure iphoneos-cross
make depend
make
Run Code Online (Sandbox Code Playgroud)

导致关于缺少包含文件(例如)的警告(during make depend)和错误(during )。传递给的典型包含路径显然是.makestdlib.hclang-I. -I.. -I../include

我认为这是相关clang默认情况下不接收特定的C选项,但如果是这样,什么是通过固定使编制工作如最明智的方式sed编辑或通过设置环境变量。(目前我没有设置任何CC*环境变量。例如/usr/include/stdlib.h在我的系统上。)

我很少在命令行上使用 OS XC 编译器,因此解决方案对我来说并不明显。

更新这是一个更具体的问题,其有效答案将获得赏金:必须对最新版本的 OpenSSL 源代码中的文件执行哪些特定编辑(类似于上面的第一个代码片段)(例如openssl-1.0.1h.tar.gz)那个人可以通过在 OS X 10.9 上发布类似于上面第二个代码片段的命令来交叉编译它,用于 OS X 10.9(即将推出 iOS 8)架构,安装 Xcode 5.1.1(即将推出 Xcode 6),没有安装 gcc 和makedepend可选安装?

que*_*ish 5

首先,您必须确保设置了当前的 Xcode 开发者目录:

xcode-select -p

这应该输出如下内容: /Applications/Xcode.app/Contents/Developer 如果你想改变它,例如在 Xcode 6 和 Xcode 5 之间切换(或者如果该命令输出一个空行),你可以使用xcode-select如下:

xcode-select -s /Applications/OldXcode.app/Contents/Developer

完成后,接下来您需要选择要使用的 SDK。由于您正在尝试为 iPhone 构建,因此它将是 iPhoneOS SDK 的某个版本。您可以使用以下命令找到默认情况下它将尝试使用的版本:

xcrun --sdk iphoneos --show-sdk-version

这将输出类似7.1. 如果您需要不同的 SDK 版本,您可以使用带有版本的特定 SDK 名称来提供,即iphoneos7.1. 这当然必须已经安装在您选择的 Xcode 版本中xcode-select

因此,假设您连续拥有所有这些鸭子,使用该信息进行交叉编译非常容易。例如:

make CC="$(xcrun --sdk iphoneos --find clang) -isysroot $(xcrun --sdk iphoneos --show-sdk-path) -arch armv7 -arch armv7s -arch arm64"

这将通过 传递 CC 命令xcrun,使用 Xcode 设置的当前 iphoneos SDK 的参数,使用xcode-selectSDK 根作为 sys 根进行构建,并为架构 armv7、armv7s 和 arm64 构建。为 iOS 模拟器构建与上述类似,但将 iphonesimulator 代替 iphoneos 作为 SDK 传递,并将架构设置为 i386 和 x86_64。

有了这个,事情应该几乎可以正常工作,您可能不需要做任何进一步的事情 - 不幸的是,我无法自己尝试这个,我指的是以前项目的笔记。您可能会遇到特定于 OpenSSL 或其构建脚本的后续问题。

请注意,上述所有内容也可用于为 MacOS X 进行编译,显然具有不同的 SDK 和架构值。