交叉编译boost context出现的问题

        在上一篇文章中使用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位的代码。

        重新编译,发现没有错误提示,也编译成功了。放到盒子上运行,可以正常运行。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
NDK交叉编译Boost是将Boost库编译成适用于Android平台的库文件,以便在Android应用中使用Boost库的功能。下面是一般的NDK交叉编译Boost的步骤: 1. 下载NDK:首先,你需要下载并安装Android NDK,可以从官方网站(https://developer.android.com/ndk/downloads)上获取最新版本的NDK。 2. 下载Boost库:接下来,你需要下载Boost库的源代码。你可以从Boost官方网站(https://www.boost.org/users/download/)上下载最新版本的Boost库。 3. 配置Boost库:解压下载的Boost源代码,并进入解压后的目录。在终端中执行以下命令来配置Boost库: ``` ./bootstrap.sh --with-libraries=<library_names> --with-toolset=<toolset_name> --prefix=<install_path> ``` 其中,`<library_names>`是你需要编译的Boost库的名称,可以根据你的需求进行选择;`<toolset_name>`是你要使用的编译工具链,例如`clang`或`gcc`;`<install_path>`是你希望安装Boost库的路径。 4. 编辑user-config.jam文件:在Boost源代码目录下,创建一个名为`user-config.jam`的文件,并添加以下内容: ``` using clang : <ndk_version> : <path_to_ndk>/toolchains/llvm/prebuilt/<host_os>/bin/clang++ ; ``` 其中,`<ndk_version>`是你下载的NDK的版本号,`<path_to_ndk>`是你安装NDK的路径,`<host_os>`是你的操作系统类型(例如`darwin-x86_64`或`linux-x86_64`)。 5. 开始编译Boost库:在终端中执行以下命令来开始编译Boost库: ``` ./b2 toolset=clang-<ndk_version> target-os=android link=static threading=multi variant=release install ``` 这将使用指定的编译工具链和选项来编译Boost库,并将编译结果安装到之前配置的安装路径中。 6. 完成编译:等待编译过程完成,然后你将在之前配置的安装路径中找到编译好的Boost库文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值