【问题标题】:Cross-Compiling Swiften library for ARM-embedded with SCons makery交叉编译 Swiften 库,用于 ARM 嵌入式与 SCons 制造商
【发布时间】:2014-06-09 01:36:03
【问题描述】:

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

在对 SCons 知之甚少的情况下,我破解了一个成功的交叉编译方式。我将在这里列出我的技巧,希望有人可以使用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 不起作用(虽然不推荐,但在 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.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-embedded的新目标,就像其他目标一样; iPhone、安卓等
  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

【问题讨论】:

标签: android scons swiften


【解决方案1】:

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

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

【讨论】:

  • 谢谢,@dirkbaechle。从您那里得到提示,我尝试在 CC 和 CXX 前面加上工具链值,并且 SCons 选择了正确的编译器。稍后我会尝试将它们作为 args。
【解决方案2】:

我在上面留下了关于交叉编译的评论。它已经在提供的链接中得到了回答,但基本上您只需要设置适当的构造变量: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"])

【讨论】:

    【解决方案3】:

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

    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',但这对您来说有点麻烦。

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 2019-05-26
      相关资源
      最近更新 更多