先安装 ARMv7L 交叉编译器环境:
在 Ubuntu 18.04 x86_64 上面安装 Linux-ARMv7 A/L GCC编译器-CSDN博客
1、下载 boost 1.84 的源代码访问要编译的目录,并且解压出来源代码,切入源代码根目录
2、./bootstrap.sh --with-libraries=filesystem,thread --with-toolset=gcc
--with-libraries=filesystem,thread 可以省略,就是尝试编译所有的库
3、上一条命令生成出 b2,之后同时还会生成一个 project-config.jam 的配置文件
4、修改这个配置文件
把这段
if ! gcc in [ feature.values <toolset> ]
{
using gcc ;
}
替换成
if ! gcc in [ feature.values <toolset> ]
{
using gcc : arm : /usr/bin/arm-linux-gnueabihf-gcc ;
}
这个 ARM 就是架构的意思,但这个架构是不存在的,所以会导致 boost::context 编译不出来。
参考问题:
Add arm/sysv/elf alias to arm/aapcs/elf (32/64) · bwijen/context@dd2d908 (github.com)
所以:
有两个解决方案。
1、架构改成 nano libs/context/build/Jamfile.v2 文件之中存在的架构(当然要改对)。
2、在 libs/context/build/Jamfile.v2 文件中新增架构,如新增ARM架构(跟上面遥相呼应)。
alias asm_sources
: asm/make_arm_aapcs_elf_gas.S
asm/jump_arm_aapcs_elf_gas.S
asm/ontop_arm_aapcs_elf_gas.S
: <abi>sysv
<address-model>32
<architecture>arm
<binary-format>elf
<toolset>gcc
;
alias asm_sources
: asm/make_arm64_aapcs_elf_gas.S
asm/jump_arm64_aapcs_elf_gas.S
asm/ontop_arm64_aapcs_elf_gas.S
: <abi>sysv
<address-model>64
<architecture>arm
<binary-format>elf
<toolset>gcc
;
最后编译库:
./b2 -j32
确定 boost context 库是否正确的被编译,不正确编译也是会生产库(so、a)文件的,所以要自己去输出库搜下导出符号信息:
cd stage/lib
strings libboost_context.a | grep make_fcontext
objdump -D -tT -C libboost_context.a | grep make_fcontext
nm -C libboost_context.a | grep make_fcontext
如果出来有这个符号,就说明库被正确编译了,基本上这种问题,只会在跨平台编译才会出现,比如用NDK编Android下工作的boost库。