0x01前言
最近项目用到了websocket,websocket相对应的库比较多,但是大多数基于C++实现,有一些还需要C++11及以上特性,对于嵌入式的一些应用场景不是特别友好,在网上查阅后发现nopoll采用C语言实现,能够更好的支持老版本的GCC编译器和开发环境,因此暂时选择nopoll,大家有更好的欢迎推荐。下面进入正题,开始aarch64平台移植nopoll。
0x02下载nopoll
nopoll官网提供编译好的二进制安装包,官网http://www.aspl.es/nopoll/downloads.html
源码可以从github下载,地址https://github.com/asples/nopoll
多说一句,github下载比较慢,网上有方法提高下载速度,参考链接https://www.zhihu.com/question/276143842?sort=created
0x03安装openssl
由于使用的交叉编译环境没有openssl,所以需要自己手动源码编译安装,arm平台openssl编译安装其他文章讲的比较多,在此不累述。
0x04编译nopoll
(1)编译nopoll前需要安装autoconf和automake,然后执行./autogen.sh,执行autogen.sh后生成configure;
(2)生成Makefile
./configure --prefix=/usr/local/env --host=aarch64-unknown-linux-gnu CC=aarch64-unknown-linux-gnu-gcc CPP=aarch64-unknown-linux-gnu-cpp CFLAGS="--sysroot=/usr/local/env -I/usr/local/env/include -L/usr/local/env/lib -lcrypto -ldl" CPPFLAGS="--sysroot=/usr/local/env -I/usr/local/env/include -L/usr/local/env/lib -lcrypto -ldl"
上面命令检测环境不支持epoll,由于属于交叉编译,无法判断目标系统是否支持epoll,所以configure检测到交叉编译环境就设置epoll为no,如果需要epoll支持,可以修改configure文件。
![]()
将enable_cv_epoll修改为yes,修改后重新执行configure。
(3)修改源代码
此时执行Makefile会报错,错误信息如下:
![]()
以上错误为绑定网卡参数,没有仔细分析对应平台是否支持,直接修改代码nopoll_conn.c:222,为return nopoll_false。
(4)修改libtool
libtool用于生成最终的库文件,需要执行sysroot,否则生成库时会报错。

打开libtool文件,找到如下位置:
![]()
在-shared后增--sysroot,比如--sysroot=/usr/local/env。
(5)编译nopoll库
执行make命令进行编译,此时已经可以成功编译出库文件,但是编译test测试程序失败。
(6)编译test
如果需要编译test测试程序,需要修改test/Makefile,在Makefile中找到PTHREAD_LIBS=,修改为PTHREAD_LIBS = -lphtread。
0x05总结
以上是在aarch64平台编译nopoll的过程以及遇到的问题解决方法,由于对automake编译方法不熟悉,上面提到的一些解决方法或许有更好的解决方式,如果有朋友知道,欢迎指教。
本文介绍了在aarch64平台上移植和编译websocket库nopoll的过程。首先,文章提及nopoll因其C语言实现和对老版GCC的兼容性而被选用。接着,详细阐述了从下载nopoll源码到安装openssl,再到解决交叉编译中关于epoll、libtool和pthread的问题,最后成功编译出库文件和test程序的步骤。文章末尾,作者期待能有更优的解决方案并欢迎大家交流。
6958

被折叠的 条评论
为什么被折叠?



