Swiften是一个XMPP客户端库,我的目标是为运行Linux的ARM嵌入式目标构建它。
我在对SCons知之甚少的情况下,成功地进行了交叉编译。我将在这里展示我的黑客行为,希望有人能向我指出一个使用两个makery文件SConscript.boot和SConstruct的可维护解决方案。
我有两项任务(都没有圆满完成):
3rdParty文件夹中)。将工具链从本机编译切换到对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没有工作(虽然不推荐,但在一个地方中提到)。
即使在对工厂进行了许多特别的更改之后,Scon也只会选择本地工具链。
因此,作为一个黑客,我必须改变本地工具链指向交叉工具链。
/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来修复的。
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库链接,我必须将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/.Help
由于不了解scon的工作原理,我做了一些技巧来让它开始工作。
我想要一些帮助:
更新 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发布于 2014-06-09 09:04:13
布雷迪的回答是正确的,关于你将如何在普通的SCons中这样做。我只想提到,Swiften的顶级SConstruct已经为使用本地工具链提供了诸如"cc=“和"cxx=”之类的参数。您可能需要检查scons -h的输出,以获得可用选项的完整列表。
此外,用于SConscript构建的OpenSSL希望源位于名为"openssl“的相对文件夹中,而不是像您这样的"openssl-1.0.1c”。也许这就是构建问题的主要来源。
发布于 2014-06-09 08:46:52
我在上面留下了一个关于交叉编译的评论。它已经在提供的链接中得到了回答,但是基本上您只需要设置适当的构造变量: 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"])发布于 2014-08-26 16:39:38
编译器的选择和附加标志都可以在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,您应该能够提取到3 3rdParty/OpenSSL中,并将openssl_force_bundled = True添加到您的config.py中。您不应该需要自己摆弄设置包含这方面的路径。可以想象,这与一个特定的openssl版本有关,因为我从1.0.0a开始就没有编译过绑定的openssl,但是如果它不能与当前版本一起工作,那么它可能是一个应该修复的bug。您也可以自己交叉编译openssl并使用openssl='/path/to/openssl',但这对您来说有点麻烦。
https://stackoverflow.com/questions/24112641
复制相似问题