【问题标题】:Errors when cross-compiling OpenSSL on OS X for iOS with Clang instead of gcc使用 Clang 而不是 gcc 在 OS X for iOS 上交叉编译 OpenSSL 时出错
【发布时间】:2014-09-04 07:12:34
【问题描述】:

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

按照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

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

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

更新这是一个更具体的问题,对于谁的有效答案将获得奖励:必须在最新版本的 OpenSSL 源代码(例如 openssl-1.0.1h.tar.gz)中的文件,以便可以通过在带有 Xcode 5.1 的 OS X 10.9 上针对 iOS 7(即将推出 iOS 8)架构发出类似于上面第二个代码 sn-p 的命令来交叉编译它.1(很快 Xcode 6)已安装,未安装 gcc 并且可选安装 makedepend

【问题讨论】:

  • 你在命令行看到了什么输出? “xcrun gcc”
  • @quellish 我得到clang: error: no input files。所以gcc显然是以Clang的形式存在的。所以我的意思是它没有被安装是我没有尝试(重新)安装它与 MacPorts,Homebrew,......
  • 如果你安装了 Xcode,你不应该安装任何东西。 'gcc' 是 clang 的别名,它将接受 gcc 的选项。这是替代品的下降。如果命令行中的“gcc”对您不起作用,请使用“xcrun gcc”调用它。在小牛队应该。除此之外,您只需更改 CFLAGS 和 LDFLAGS 即可进行所需的交叉编译。
  • +1 @quellish 您能否提出使交叉编译工作的具体值(赏金是您的……)? Here 是 OpenSSL 下载链接。例如。 export CFLAGS=-I/usr/include; makemake CGLAGS=-I/usr/include 都会导致(尽管不同)错误。关于目录/SDKs/ 似乎也存在(可能是后续)问题,我的Mac 上缺少该问题。 (不过,我确实在 Mavericks 上安装了 Xcode 5.1.1——甚至是 Xcode 6.0。)

标签: ios gcc openssl clang std


【解决方案1】:

首先,您必须确保设置了当前的 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 和构建手臂64。为 iOS 模拟器构建与上述类似,但通过 iphonesimulator 代替 iphoneos 作为 SDK,并将架构设置为 i386 和 x86_64。

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

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

【讨论】:

  • +1 谢谢,这很有帮助,尽管 OpenSSL 构建脚本确实仍然会导致一些后续问题。
  • OpenSSL 构建脚本目前给您带来了哪些问题?可能有简单的解决方案。不幸的是,直到今晚或明天晚些时候,我才能自己尝试构建它。
  • 好吧,我现在更进一步了。交叉编译工作,链接还没有。我现在显然需要做的是在对 $(AR) $(LIB) $(LIBOBJ) 的调用中使用 lipo 作为 $(AR)在可能存在也可能不存在的 *.a 文件(即 $(LIB))中为多个体系结构(armv7s、armv7、arm64)步进几个 *.o 文件(在 $(LIBOBJ) 中列出的那些文件)。也许归结为编写一个简短的 bash 脚本(我很久没有这样做了:) ar 说它无法处理胖 *.a 文件。
【解决方案2】:

我不知道这是否正是您想要的...但是我按照以下脚本为 iOS 编译 OpenSSL: https://github.com/x2on/OpenSSL-for-iPhone/blob/master/build-libssl.sh

而且非常简单... 无论如何,这里的这个答案可以帮助其他人寻找如何为 iOS 编译 OpenSSL。

【讨论】:

  • 谢谢,是的,我现在也找到了这个脚本,但是由于我已经投入了相当多的时间,而且这涉及到一个安全话题,我现在将投入更多的精力来尝试了解到底发生了什么,而不仅仅是运行某人的方便脚本。我快到了……
  • 我明白了...我注意到了...当您完成您的解决方案后,请在此处发布...我很好奇...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 2023-04-07
  • 2014-08-14
  • 2011-03-17
  • 2014-06-23
  • 1970-01-01
  • 2021-01-21
相关资源
最近更新 更多