Android 用于嵌入SCons makery的ARM的交叉编译Swiften库
Swiften是一个XMPP客户端库,我的目标是为运行Linux的ARM嵌入式目标构建它 我在不了解SCON的情况下成功地进行了交叉编译。我将在这里展示我的技巧,希望有人能给我指出一个使用两个makery文件的可维护解决方案,Android 用于嵌入SCons makery的ARM的交叉编译Swiften库,android,scons,swiften,Android,Scons,Swiften,Swiften是一个XMPP客户端库,我的目标是为运行Linux的ARM嵌入式目标构建它 我在不了解SCON的情况下成功地进行了交叉编译。我将在这里展示我的技巧,希望有人能给我指出一个使用两个makery文件的可维护解决方案,SConscript.boot和SConstruct 我有两项任务(都没有圆满完成): 成功地将工具链从本机编译切换到交叉编译 确保OpenSSL库成功链接(不是由项目提供的;它们必须安装并构建在3rdParty文件夹中) 为ARM将工具链从本机编译切换到交叉编译 我的手臂
SConscript.boot
和SConstruct
我有两项任务(都没有圆满完成):
3rdParty
文件夹中)/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进行了许多临时更改之后,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链接
为了让示例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的工作原理,我做了一些尝试来让它发挥作用
我想得到一些帮助:
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
我在上面就交叉编译留下了评论。它已经在提供的链接中得到了回答,但基本上您只需要设置适当的构造变量:CC、CXX、link等等 至于“将OpenSSL集成到构建中的干净方法”,这可以通过添加库和适当地包括路径来实现,如下所示,适当地替换引用的值: (无需复制/移动原始文件)
我在上面就交叉编译留下了评论。它已经在提供的链接中得到了回答,但基本上您只需要设置适当的构造变量:CC、CXX、link等等 至于“将OpenSSL集成到构建中的干净方法”,这可以通过添加库和适当地包括路径来实现,如下所示,适当地替换引用的值: (无需复制/移动原始文件)
布雷迪的答案是正确的,关于你如何在普通烤饼中做到这一点。我只想提到Swiften的顶级SCOnstucture已经提供了诸如“
cc=
”和“cxx=
”之类的参数来使用本地工具链。
您可能需要检查scons-h
的输出,以获得可用选项的完整列表
此外,OpenSSL构建的SConscript要求源代码位于名为“
OpenSSL
”的相对文件夹中,而不是像您的情况那样位于“OpenSSL-1.0.1c
”的相对文件夹中。也许这就是你的构建问题的主要来源。Brady的答案是正确的,关于如何在普通的烤饼中实现它。我只想提到Swiften的顶级SCOnstucture已经提供了诸如“cc=
”和“cxx=
”之类的参数来使用本地工具链。
您可能需要检查scons-h
的输出,以获得可用选项的完整列表
此外,OpenSSL构建的SConscript要求源代码位于名为“
OpenSSL
”的相对文件夹中,而不是像您的情况那样位于“OpenSSL-1.0.1c
”的相对文件夹中。可能这就是构建问题的主要来源。编译器的选择和附加标志都可以在Swift的config.py文件中设置。下面是config.py中使用自定义编译器和标志的代码段(我在一个开发框中使用的代码段):
这应该以同样的方式用于交叉编译
要使用捆绑的openssl,您应该能够提取到第三方/openssl,并将
openssl\u force\u bundled=True
添加到config.py。您不需要自己去摆弄设置include路径。可以想象,这与特定的openssl版本有关,因为我从1.0.0a开始就没有编译过捆绑的openssl,但是如果它不能与当前版本一起工作,那么可能是一个应该修复的bug。您也可以自己交叉编译openssl并使用openssl='/path/to/openssl'
,但这对您来说有点麻烦。编译器的选择和附加标志都可以在Swift的config.py文件中设置。下面是config.py中使用自定义编译器和标志的代码段(我在一个开发框中使用的代码段):
这应该以同样的方式用于交叉编译
要使用捆绑的openssl,您应该能够提取到第三方/openssl,并将openssl\u force\u bundled=True
添加到config.py。您不需要自己去摆弄设置include路径。可以想象的是,这是t
# 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"])
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"