繁体   English   中英

用于嵌入SCons makery的ARM的交叉编译Swiften库

[英]Cross-Compiling Swiften library for ARM-embedded with SCons makery

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

我几乎不懂SCons,就闯入了成功的交叉编译之路。 我将在这里布置我的黑客程序,希望有人可以使用两个Makery文件SConscript.bootSConstruct指向我一个可维护的解决方案。

我完成了两项任务(均未令人满意地完成):

  1. 成功地将工具链从本地编译切换到交叉编译
  2. 确保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没有工作(虽然不推荐,它在提到一个地方 )。

即使在对makery进行了许多临时更改之后,Scons也只会选择本地工具链。

因此,作为一种技巧 ,我不得不更改本机工具链以指向交叉工具链。

/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添加到构建脚本的默认部分SConscript.bootSConscript.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链接

为了使示例Switften程序能够与OpenSSL库链接,我不得不将libssl.alibcrypto.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的工作原理,我进行了一些破解以使其正常工作。

我想要一些帮助:

  1. 与其他目标一样,引入一个称为ARM嵌入式的新目标。 iPhone,Android等
  2. 将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

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

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

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

对于“将OpenSSL集成到构建中的干净方法”,可以简单地通过添加库来执行,并适当地包含路径,如下所示:适当地替换引用的值:(无需复制/移动原始文件)

# 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"])

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

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,您应该只能解压缩到3rdParty / OpenSSL中,然后将openssl_force_bundled = True添加到config.py中。 您无需自己设置包含路径。 可以想象这与特定的openssl版本有关,因为自1.0.0a起我还没有编译过捆绑的openssl,但是如果它不适用于当前版本,则可能是应该修复的错误。 您也可以自己交叉编译openssl并使用openssl='/path/to/openssl' ,但这对您来说有点麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM