我想按照WWDC 2014会话305视频和OpenSSL网站上的说明,在没有安装gcc的情况下在OS X上交叉编译OpenSSL 1.0.1h for iOS。
我按照建议here解压缩/解压并从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
请注意,我必须坚持使用makedepend
工具,否则make depend
步骤将失败(如前所述elsewhere)。使用brew install makedepend
安装该工具对我来说不是问题(但在Clang旁边安装gcc)。现在
./Configure iphoneos-cross
make depend
make
导致警告(在make depend
期间)和错误(在make
期间)有关丢失的包含文件(例如stdlib.h
)。传递给clang
的典型包含路径显然是-I. -I.. -I../include
。
我认为这是related到clang
默认情况下没有收到特定的C选项,但如果是这样,那么使编译工作最合理的方法是什么?通过修复sed
编辑或设置环境变量。 (目前我没有设置任何CC*
个环境变量。我的系统上有例如/usr/include/stdlib.h
。)
我很少在命令行上使用OS X C编译器,因此解决方案对我来说并不明显。
更新以下是更具体的问题,其有效答案将获得奖励:必须对文件执行哪些特定编辑(类似于上面的第一个代码段)最新版本的OpenSSL源代码(例如openssl-1.0.1h.tar.gz
),以便可以通过发出类似于上面第二个代码片段的命令来交叉编译它,这些代码片段适用于OS X 10.9和Xcode 5.1.1上的iOS 7(即将推出的iOS 8)体系结构(很快就安装了Xcode 6),没有安装gcc,可选择安装makedepend
?
答案 0 :(得分:4)
首先,您必须确保设置了当前的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-select
选择的Xcode版本中。
因此,假设您拥有所有这些鸭子,使用该信息进行交叉编译非常简单。例如:
make CC="$(xcrun --sdk iphoneos --find clang) -isysroot $(xcrun --sdk iphoneos --show-sdk-path) -arch armv7 -arch armv7s -arch arm64"
这将通过xcrun
传递CC命令,其参数使用由xcode-select
设置的Xcode的当前iphoneos SDK,使用SDK根作为sys根构建并构建用于体系结构armv7 ,armv7s和arm64。 iOS模拟器的构建与上面类似,但是将iphonesimulator替换为iphone作为SDK,并将架构设置为i386和x86_64。
有了它,事情应该只是工作,你可能不需要做任何进一步的事情 - 不幸的是我不能自己尝试这个并且我指的是前一个项目的笔记。您可能会遇到特定于OpenSSL或其构建脚本的后续问题。
请注意,以上所有内容都可以用于编译MacOS X,显然具有不同的SDK和架构值。
答案 1 :(得分:1)
我不知道它是不是你想要的......但是我按照这个脚本编译OpenSSL for iOS: https://github.com/x2on/OpenSSL-for-iPhone/blob/master/build-libssl.sh
而且非常简单...... 无论如何,这里的答案可以帮助其他人寻找如何编译OpenSSL for iOS。