Libwebsockets的交叉编译

关键词

libwebsockets cmake ARM平台

摘要

本案例主要是介绍了如何在ubuntu平台下交叉编译出目标平台是ARM平台的libwebsockets库。通过修改CMake脚本一步步的编译出目标平台上的库文件。


 

1 案例描述

Libwebsockets库是一个开源的websocket组件,源码是用c语言编写的,组件中是通过cmake脚本来生成makefile脚本,再通过make来编译出目标文件,我们需要在嵌入式的arm平台中跑这个库,那么就需要改造下cmake脚本来交叉编译。

2 websocket协议的简单介绍

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

(此简介参考维基百科)

我们项目中主要考虑到了客户端和服务端都需要主动推送消息,所以选择了websocket协议。

 

3.libwebsockets的交叉编译

前端协议层使用的都是C的源码,在网上搜索之后,发现libwebsockets是一个比较灵活、轻量级的库,而且能满足信令上的交互,所以我们选择了这个库作为我们项目中websocket的组件。

 

3.1 Cmake交叉编译配置: CMakeLists.txt

首先找到cmake的入口配置的脚本:下图中为cmake脚本的配置项,option后面的选项如果不需要可以修改成OFF,这次的编译则去掉了ssl的依赖。单交叉编译一个libwebsockets库,有依赖库的情况下需要把依赖库也交叉编译完,并指定依赖库的位置。

 

 

 

 

3.2 交叉编译需要修改CmakeLists.txt脚本

在脚本中加入:

 1  # 设置交叉编译 -----------------------------------------------
 2  # CMAKE_SYSTEM_NAME:指定目标机所在的操作系统名称,只有当该变量被设置了,CMake才认为此时正值交叉编译
 3  # CMAKE_FIND_ROOT_PATH:代表一系列的相关文件夹路径的根路径的变更,所有的Find_***.cmake脚本首先会在这个路径的usr/lib,lib目录下找,然后才会去系统的目录下找。可以指定多个路径
 4  # CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:有三种取值:NEVER,ONLY,BOTH  ,这边选NEVER表示不在当前机器的系统目录下查找,而是去宿主机查找
 5  # CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:选ONLY表示依赖库只在交叉编译环境中找
 6  # CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:表示依赖的头文件只在交叉编译环境中找
 7  # CMAKE_C_COMPILER CMAKE_CXX_COMPILE:指定交叉编译链gcc和g++
 8  9  SET(CMAKE_SYSTEM_NAME Linux)
10  SET(CMAKE_FIND_ROOT_PATH "/opt/arm/gcc/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/")
11  SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
12  SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
13  SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
14  SET(CMAKE_C_COMPILER "/opt/arm/gcc/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc")
15  SET(CMAKE_CXX_COMPILE "/opt/arm/gcc/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-g++")
16  # ------------------------------------------------------------

 

 

根据自己的需要,修改完option选项以及加上交叉编译修改的参数之后 ,就可以通过cmake命令来生成编译脚本了:

3.3 用于指定安装路径的cmake 指令:

1  $ cmake ../ -DCMAKE_INSTALL_PREFIX=/opt/arm/lib/libwebsockets 

下图是通过cmake命令生成的makefile脚本

 

 

 

 

 

3.4 make编译

1  $ make -j8

 

 

 

 

 

 

3.5 库的安装:

1  $ sudo make install

 

 

 

 

3.6 查看库的系统架构

通过readelf查看下编译的库是否正确:

1  $ readelf -h libwebsockets.so

 

 

 

目标平台是ARM的,到了这一步就差不多能确定是交叉编译成功了。

 

posted @ 2022-03-25 01:13  liu-huan  阅读(2760)  评论(0编辑  收藏  举报