在上一篇文章中使用boost协程搭建tcp服务器,我介绍了怎么使用协程来搭建tcp服务,其中需要连接的库有boost_coroutine,boost_coroutine还使用到了libboost_context。
当编写完代码后,我在ubuntu中运行没有问题,因此我就想要将其放到我的嵌入式设备当中运行,结果发现了问题。
交叉编译脚本:
我这里使用的是boost_1_78_0
#!/bin/bash
CROSS_COMPILE=$1
CXX=${CROSS_COMPILE}g++
CC=${CROSS_COMPILE}gcc
obj_dir=$(pwd)
tar xzf boost_1_78_0.tar.gz
cd boost_1_78_0
./bootstrap.sh --prefix=$obj_dir --with-libraries=context,coroutine
if [[ $CC == "arm"* ]]; then
sed -i s/'using gcc ; '/'using gcc : : '$CC' -fPIC ;'/g project-config.jam
fi
./b2
./b2 install
在运行b2的时候发现出现错误
error: No best alternative for libs/context/build/asm_sources
但是又能正常编译完成,因此我没有在意这个错误。
在嵌入式环境下我使用的是静态库的连接形式
arm-linux-gnueabi-g++ tcp_server.cpp -std=c++11 -lpthread ./lib/boost/lib/libboost_coroutine.a ./lib/boost/lib/libboost_context.a -I ./lib/boost/include/ -o tcp_server
将可执行文件传到嵌入式盒子上之后,运行出现了问题:
undefined symbol: make_fcontext
找不到make_fcontext这个符号,奇怪明明是已经链接了libboost_context怎么还会出现这个问题。想起来刚才在编译的时候的哪个错误,感觉要修复这个问题可能可以解决。
查找了很多资料,最后在https://github.com/boostorg/context/issues/69找到了解决方法https://github.com/bwijen/context/commit/dd2d908042117c6ff6c5264394ece9a6e3db4df2,也就在libs/context/build/Jamfile.v2里增加以下内容:
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
;
根据里面的内容修改编译脚本:
#!/bin/bash
CROSS_COMPILE=$1
CXX=${CROSS_COMPILE}g++
CC=${CROSS_COMPILE}gcc
obj_dir=$(pwd)
echo $CC
tar xzf boost_1_78_0.tar.gz
cd boost_1_78_0
./bootstrap.sh --prefix=$obj_dir --with-libraries=context,coroutine
if [[ $CC == "arm"* ]]; then
sed -i s/'using gcc ; '/'using gcc : : '$CC' -fPIC ;'/g project-config.jam
sed -i 's/ARM\/AAPCS\/ELF/ARM\/AAPCS\/ELF\nalias asm_sources\n : asm\/make_arm_aapcs_elf_gas.S\n asm\/jump_arm_aapcs_elf_gas.S\n asm\/ontop_arm_aapcs_elf_gas.S\n : <abi>sysv\n <address-model>32\n <architecture>arm\n <binary-format>elf\n <toolset>gcc\n ;/g' libs/context/build/Jamfile.v2
fi
./b2
./b2 install
因为我使用的是32位系统,因此就加了32位的代码。
重新编译,发现没有错误提示,也编译成功了。放到盒子上运行,可以正常运行。