【发布时间】:2014-06-09 01:36:03
【问题描述】:
Swiften 是一个 XMPP 客户端库,我的目标是为运行 Linux 的 ARM 嵌入式目标构建它。
在对 SCons 知之甚少的情况下,我破解了一个成功的交叉编译方式。我将在这里列出我的技巧,希望有人可以使用SConscript.boot 和SConstruct 这两个制造文件向我指出一个可维护的解决方案。
我有两个任务(都没有令人满意地完成):
- 工具链从原生编译成功切换到交叉编译
- 确保 OpenSSL 库已成功链接(swiftim 项目未提供;它们必须安装并构建在
3rdParty文件夹中)。
将工具链从本机编译切换到 ARM 的交叉编译
我的ARM跨工具链组件,gcc、g++、ld等都在这里。
/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/arm-linux-gnueabihf/bin/
我找不到方法告诉scons 使用交叉工具链(来自上述位置)而不是本机工具(在通常的位置,/usr/bin)。在调用 (./scons Swiften) 之前使用环境变量的完全限定值,CC 和 CXX 不起作用(虽然不推荐,但在 one place 中有所提及)。
Scons 将仅使用 native 工具链,即使在对制造商进行了多次临时更改之后也是如此。
所以,作为一个hack,我不得不将本地工具链更改为指向交叉工具链。
/usr/bin/gcc -> /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/bin/arm-linux-gnueabihf-gcc-4.7.3*
/usr/bin/g++ -> /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/bin/arm-linux-gnueabihf-g++*
通过将下面的行添加到构建脚本的默认部分 SConscript.boot 来修复 ARM 的第一个编译中断。
env.Append(CPPDEFINES = ["_LITTLE_ENDIAN"])
下一个编译中断与未找到 OpenSSL 头文件有关。为了解决位置问题,我不得不在 SConscript.boot 中引入以下行
vars.Add(PackageVariable("openssl", "OpenSSL location", "/home/auro-tripathy/swiftim/swift/3rdParty/OpenSSL/openssl-1.0.1c/"))
与 OpenSSL 的链接
对于与 OpenSSL 库链接的示例 Switften 程序,我必须将 libssl.a 和 libcrypto.a(单独构建)从它们构建的位置移动到工具链库位置,就像这样。
mv ~/swiftim/swift/3rdParty/OpenSSL/openssl-1.0.1c/libcrypto.a /opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/lib/gcc/arm-linux-gnueabihf/4.7.3/.
帮助
不了解 scons 的工作原理,我做了一些小技巧来让它工作。
我需要一些帮助:
- 引入一个名为ARM-embedded的新目标,就像其他目标一样; iPhone、安卓等
- 将 OpenSSL 集成到构建中的简洁方式。
更新 Per dirkbaechle,重试下面的脚本,它可以工作
export CC=/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/arm-linux-gnueabihf/bin/gcc
export CXX=/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/arm-linux-gnueabihf/bin/g++
./scons Swiften
【问题讨论】:
-
您问题的交叉编译方面已在其他地方得到解答:stackoverflow.com/a/15206709/1158895