[英]Cross-Compiling Swiften library for ARM-embedded with SCons makery
Swiften是XMPP客户端库,我的目标是为运行Linux的ARM嵌入式目标构建它。
我几乎不懂SCons,就闯入了成功的交叉编译之路。 我将在这里布置我的黑客程序,希望有人可以使用两个Makery文件SConscript.boot
和SConstruct
指向我一个可维护的解决方案。
我完成了两项任务(均未令人满意地完成):
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.boot
, 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链接
为了使示例Switften程序能够与OpenSSL库链接,我不得不将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的工作原理,我进行了一些破解以使其正常工作。
我想要一些帮助:
更新 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.