交叉编译运行websocketpp程序踩到的一些坑

本文详细介绍了如何在x86架构上安装和编译WebSocketpp库,以及如何在ARM架构上进行交叉编译。针对ARM平台,需要下载arm编译器并手动编译boost库,确保编译器指向正确的路径。编译WebSocketpp时,需通过-I参数指定头文件路径。最终,将编译好的可执行文件和对应的32位库文件移植到ARM设备上,才能正常运行。

最近要用c++搞个websocket项目,但是要求能够在arm架构上使用,上网搜websocket相关的库,最后选择了websocketpp来进行开发,选择这个库的原因首先是因为,websocketpp安装比较简单,运行也比较简单,首先他只依赖于boost库,运行时只要在代码中添加头文件就能够运行了,不需要生成库文件

x86架构安装过程

先记录下x86架构下的websocketpp库的安装过程
首先安装boost库,我的环境是ubuntu,指令安装:

sudo apt install libboost-dev

安装后库文件的默认路径为

/usr/lib/x86_64-linux-gnu

接下来安装websocketpp

git clone https://github.com/zaphoyd/websocketpp.git
cd websocketpp
mkdir build
cd build
cmake ..
make
sudo make install

安装后没有库文件,只有头文件,头文件保存路径

/usr/local/include

websocketpp自带了很多演示程序,都在example路径下, 以echo_server为例,编译指令:

g++ echo_server.cpp -o echo_server -lphtread -lboost_system

编译后即可运行,可以通过http://www.websocket-test.com/这个网址来进行测试

arm架构下安装过程

然后问题就来了,因为需要在arm架构下运行,以上安装方法就不适用了,用x86架构下生成的可执行文件在arm架构下是没办法执行的,所以我们没办法用gcc与编译源文件了,你得下个arm的编译器,这里我用的是arm-linux-gnueabihf-gcc

boost库也不能简单的用指令来进行安装了,因为用指令安装他会选择默认的编译器,可能使用gcc来进行编译,安装后库文件是64位的,当你将代码编译好后运行可执行文件会遇到wrong ELF class:ELFCLASS64这个错误
所以我们需要下载boost的源文件压缩包来进行安装,地址:https://www.boost.org/users/download/
下载后解压,进入文件夹,使用指令:

./bootstrap.sh 

来进行安装,当然,指令后可以接 -prefix= 参数来指定安装的目录
运行完成后会生成b2、bjam、project-config.jam,project-config.jam属于安装的配置文件,通过修改其中一行来指定使用arm编译器来对boost库进行编译

# Boost.Build Configuration
# Automatically generated by bootstrap.sh

import option ;
import feature ;

# Compiler configuration. This definition will be used unless
# you already have defined some toolsets in your user-config.jam
# file.
if ! gcc in [ feature.values <toolset> ]
{
    using gcc : : /opt/gcc-arm-linux-gnueabihf-8.3.0/bin/arm-linux-gnueabihf-g++ ; 
}

project : default-build <toolset>gcc ;

# List of --with-<library> and --without-<library>
# options. If left empty, all libraries will be built.
# Options specified on the command line completely
# override this variable.
libraries =  --without-python --without-graph ;

# These settings are equivivalent to corresponding command-line
# options.
option.set prefix : /home/fens/workplace/asio/boost_lib ;
option.set exec-prefix : /home/fens/workplace/asio/boost_lib ;
option.set libdir : /home/fens/workplace/asio/boost_lib/lib ;
option.set includedir : /home/fens/workplace/asio/boost_lib/include ;

# Stop on first error
option.set keep-going : false ;


要注意的是 gcc那一行后边跟的要是你自己的arm编译器的位置,可能跟我的不一样,而且那一行多出的那几个空格一定不能少,不然会出错,一共4个空格
在这里插入图片描述
修改后,输入指令来进行编译

./bjam

编译后生成库文件,会保存在当前目录的stage文件夹下,然后输入指令将库文件保存到系统的lib目录下

./bjam install

到这就基本安完了,websocketpp安装过程跟x86是相同的,之后使用指令编译例子程序

arm-linux-gnueabihf-g++ echo_server.cpp -o echo_server -lpthread -lboost_system -I /usr/local/include

这个要注意的是,因为使用arm的编译器进行编译,所以编译指令是不同的,然后因为arm的编译器与x86的编译器是完全隔离的,当时安装websocketpp库是头文件默认的安装路径是x86的,arm的编译器找不到,一种办法是将头文件复制到arm编译器的头文件路径下,另一种方法就是像我这种使用 -I参数来增加编译器的查找范围
编译成功后,将可执行文件复制到arm的机器上,boost对应的32位库文件也要保存到arm机器上,不然运行可执行文件的时候会提示找不到库文件,这里保存的是boost目录下的stage目录中的库文件,保存到arm机器中的路径为

/usr/lib

到这就全部结束了,不出以外的话应该是不能出意外了,可以顺利执行的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值