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

使用Clang而不是gcc在OS X for iOS上交叉编译OpenSSL时出错,ios,gcc,openssl,clang,std,Ios,Gcc,Openssl,Clang,Std,我希望按照WWDC 2014会话305视频和OpenSSL网站中的说明,在没有安装gcc的情况下,在OS X上为iOS交叉编译OpenSSL 1.0.1h 我解压/untar并按建议从gcc切换到clang(几乎) 请注意,我必须坚持使用makedepend工具,否则makedepend步骤将失败(如前所述)。使用brew安装makeDepende安装该工具对我来说不是问题(但在Clang旁边安装gcc将是问题)。现在 导致有关缺少包含文件的警告(在make depend期间)和错误(在make

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

我解压/untar并按建议从
gcc
切换到
clang
(几乎)

请注意,我必须坚持使用
makedepend
工具,否则
makedepend
步骤将失败(如前所述)。使用
brew安装makeDepende
安装该工具对我来说不是问题(但在Clang旁边安装gcc将是问题)。现在

导致有关缺少包含文件的警告(在
make depend
期间)和错误(在
make
期间)(例如
stdlib.h
)。传递给
clang
的典型include路径显然是
-I.-I-I../include

我假设默认情况下,
clang
不接收特定的C选项,但如果是这样,那么最合理的编译方式是什么,例如通过修复
sed
编辑或设置环境变量。(目前我没有设置任何
CC*
环境变量。我的系统上有
/usr/include/stdlib.h

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


更新这里有一个更具体的问题,谁的有效答案将获得奖励:在最新版本的OpenSSL源代码(例如
OpenSSL-1.0.1h.tar.gz
)中,必须对文件执行哪些特定编辑(类似于上面的第一个代码片段)因此,对于安装了Xcode 5.1.1(很快将是Xcode 6)的OS X 10.9上的iOS 7(很快将是iOS 8)体系结构,可以通过发出类似于上面第二个代码段的命令来交叉编译它,不安装gcc,也可以选择安装
makeDepende

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

xcode选择-p

这应该输出如下内容:
/Applications/Xcode.app/Contents/Developer
如果您想更改此设置,例如在Xcode 6和Xcode 5之间切换(或者如果该命令输出一个空行),您可以使用
Xcode select
,如下所示:

xcode选择-s/Applications/OldXcode.app/Contents/Developer

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

xcrun--sdk iphoneos--show sdk版本

这将输出类似于
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
设置,使用SDK根作为系统根进行构建,并构建架构armv7、armv7s和arm64。iOS模拟器的构建与上述类似,但将iphonesimulator代替iphoneos作为SDK传递,并将架构设置为i386和x86_64

这样的话,事情就基本上正常了,你可能不需要做任何进一步的事情——不幸的是,我自己没有能力尝试这个,我指的是以前项目的笔记。您可能会遇到特定于OpenSSL或其构建脚本的后续问题


请注意,上述所有内容也可用于为MacOS X编译,显然SDK和体系结构值不同。

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

xcode选择-p

这应该输出如下内容:
/Applications/Xcode.app/Contents/Developer
如果您想更改此设置,例如在Xcode 6和Xcode 5之间切换(或者如果该命令输出一个空行),您可以使用
Xcode select
,如下所示:

xcode选择-s/Applications/OldXcode.app/Contents/Developer

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

xcrun--sdk iphoneos--show sdk版本

这将输出类似于
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
设置,使用SDK根作为系统根进行构建,并构建架构armv7、armv7s和arm64。iOS模拟器的构建与上述类似,但将iphonesimulator代替iphoneos作为SDK传递,并将架构设置为i386和x86
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
./Configure iphoneos-cross
make depend
make