首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于SCons的ARM嵌入式Swiften库的交叉编译

基于SCons的ARM嵌入式Swiften库的交叉编译
EN

Stack Overflow用户
提问于 2014-06-09 01:36:03
回答 3查看 1.4K关注 0票数 1

Swiften是一个XMPP客户端库,我的目标是为运行Linux的ARM嵌入式目标构建它。

我在对SCons知之甚少的情况下,成功地进行了交叉编译。我将在这里展示我的黑客行为,希望有人能向我指出一个使用两个makery文件SConscript.bootSConstruct的可维护解决方案。

我有两项任务(都没有圆满完成):

  1. 成功地将工具链从本机编译切换到交叉编译。
  2. 确保成功地链接了OpenSSL库(不是由提姆项目提供的;它们必须安装并构建在3rdParty文件夹中)。

将工具链从本机编译切换到对ARM进行交叉编译。

我的手臂交叉工具链部件,gcc,g++,ld等都在这里.

代码语言:javascript
复制
/opt/toolchain/gcc-linaro-arm-linux-gnueabihf-4.7-2013.01-20130125_linux/arm-linux-gnueabihf/bin/

我找不到一种方法告诉scons使用交叉工具链(从上面的位置),而不是本机工具(在通常的位置,/usr/bin)。使用环境变量的完全限定值作为调用(./scons Swiften)的前缀,CC和CXX没有工作(虽然不推荐,但在一个地方中提到)。

即使在对工厂进行了许多特别的更改之后,Scon也只会选择本地工具链。

因此,作为一个黑客,我必须改变本地工具链指向交叉工具链。

代码语言:javascript
复制
/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++*

ARM的第一个编译中断是通过将下面的行添加到构建脚本的默认部分SConscript.boot来修复的。

代码语言:javascript
复制
env.Append(CPPDEFINES = ["_LITTLE_ENDIAN"])

下一个编译中断与未找到的OpenSSL头文件有关。为了解决位置问题,我必须在SConscript.boot中引入下面的行

代码语言:javascript
复制
vars.Add(PackageVariable("openssl", "OpenSSL location", "/home/auro-tripathy/swiftim/swift/3rdParty/OpenSSL/openssl-1.0.1c/"))

与OpenSSL的链接

为了让样例开关程序与OpenSSL库链接,我必须将libssl.alibcrypto.a (分别构建)从构建的位置移到工具链库中,如下所示。

代码语言:javascript
复制
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/.

Help

由于不了解scon的工作原理,我做了一些技巧来让它开始工作。

我想要一些帮助:

  1. 引入一个名为ARM嵌入式的新目标,就像其他目标一样: iPhone、android等。
  2. 将OpenSSL集成到构建中的干净方法。

更新 Per dirkbaechle,重新尝试下面的脚本并运行

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

发布于 2014-06-09 09:04:13

布雷迪的回答是正确的,关于你将如何在普通的SCons中这样做。我只想提到,Swiften的顶级SConstruct已经为使用本地工具链提供了诸如"cc=“和"cxx=”之类的参数。您可能需要检查scons -h的输出,以获得可用选项的完整列表。

此外,用于SConscript构建的OpenSSL希望源位于名为"openssl“的相对文件夹中,而不是像您这样的"openssl-1.0.1c”。也许这就是构建问题的主要来源。

票数 3
EN

Stack Overflow用户

发布于 2014-06-09 08:46:52

我在上面留下了一个关于交叉编译的评论。它已经在提供的链接中得到了回答,但是基本上您只需要设置适当的构造变量: CC、CXX、LINK等等。

至于“将OpenSSL集成到构建中的清洁方式”,这可以通过添加库和适当地包含路径来执行,如下所示,适当地替换引用的值:(不必复制/移动原始文件)

代码语言:javascript
复制
# This sets the location of the OpenSSL Include paths
env.Append(CPPPATH="path/to/openssl/includes")

# This sets the location of the OpenSSL Libraries
env.Append(LIBPATH="path/to/openssl/libraries")

# These are the OpenSSL libraries to be linked into the binary
env.Append(LIBS=["OpenSSL_lib", "OpenSSL_lib2"])
票数 1
EN

Stack Overflow用户

发布于 2014-08-26 16:39:38

编译器的选择和附加标志都可以在Swift的config.py文件中设置。下面是使用自定义编译器和标志的config.py片段(我在我的一个开发框上使用的):

代码语言:javascript
复制
cc = link = "/usr/local/llvm-git/bin/clang"
cxx = "/usr/local/llvm-git/bin/clang++"

bothflags = " -std=c++11 -stdlib=libc++ -nostdinc++"
cxxflags = bothflags + " -I/usr/local/libcxx/include -Wno-deprecated"
linkflags = bothflags + " -L/usr/local/libcxx/lib"

这应该同样适用于交叉编译。

要使用捆绑的openssl,您应该能够提取到3 3rdParty/OpenSSL中,并将openssl_force_bundled = True添加到您的config.py中。您不应该需要自己摆弄设置包含这方面的路径。可以想象,这与一个特定的openssl版本有关,因为我从1.0.0a开始就没有编译过绑定的openssl,但是如果它不能与当前版本一起工作,那么它可能是一个应该修复的bug。您也可以自己交叉编译openssl并使用openssl='/path/to/openssl',但这对您来说有点麻烦。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24112641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档