如何移植libwebsockets

news2024/10/5 15:34:44

libwebsockets是一个高性能的开源C语言库,专为实现WebSocket协议及相关的HTTP协议而设计。它不仅使开发者能够在客户端与服务器端轻松构建WebSocket连接,还可以用作标准HTTP服务器。WebSocket是一种在单个TCP连接上进行全双工通信的协议,可以促进浏览器与服务器间实时、互动数据交换的能力,为现代网络应用提供了强大的支持。

libwebsockets在处理如HTTPS和WSS等安全连接时,依赖于OpenSSL提供的强大加密功能来保障数据的安全性。同时,为了提高网络传输效率,libwebsockets还利用ZLib库进行数据压缩。因此,在交叉编译libwebsockets库之前需要先交叉编译OpenSSL和ZLib这两个依赖库。接下来,将跟各位小伙伴详述将这三大库移植至ELF 1开发板的具体步骤。

开发环境操作系统:Ubuntu18.04

交叉编译链:arm-poky-linux-gnueabi-gcc

内核版本:Linux4.1.15

交叉编译OpenSSL

1、下载源码

https://www.openssl.org/source/old/1.1.1/

2、拷贝openssl-1.1.1c.tar.gz到开发环境/home/elf/work目录下解压

elf@ubuntu:~/work$ tar -zxvf openssl-1.1.1c.tar.gz

3、进入openssl-1.1.1c目录,执行./config生成Makefile文件

elf@ubuntu:~/work$ cd openssl-1.1.1c/
elf@ubuntu:~/work/openssl-1.1.1c$ ./config no-asm shared --prefix=/home/elf/work/openssl-1.1.1c/install

4、修改Makefile

第8行修改为:

8 PLATFORM=linux-armv7

第124行修改为:

124 CNF_CFLAGS=-pthread

第125行修改为:

125 CNF_CXXFLAGS=-std=c++11 -pthread

注释掉90-92行、99行、103行、105-106行:

90 #CROSS_COMPILE=
91 #CC=$(CROSS_COMPILE)gcc
92 #CXX=$(CROSS_COMPILE)g++
99 #MAKEDEPEND=$(CROSS_COMPILE)gcc
103 #AR=$(CROSS_COMPILE)ar
105 #RANLIB=$(CROSS_COMPILE)ranlib
106 #RC= $(CROSS_COMPILE)windres

5、设置环境变量

elf@ubuntu:~/work/openssl-1.1.1c$ . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

6、编译

elf@ubuntu:~/work/openssl-1.1.1c$ make

7、安装

elf@ubuntu:~/work/openssl-1.1.1c$ make install

8、在/home/elf/work/openssl-1.1.1c目录下会生成一个install目录

elf@ubuntu:~/work/openssl-1.1.1c/install$ ls
bin  include  lib  share  ssl

9、将install目录下的文件打包

elf@ubuntu:~/work/openssl-1.1.1c/install$ tar -cvjf openssl.tar.bz2 *

10、拷贝openssl.tar.bz2到ELF 1开发板根目录下解压

root@ELF1:~# cd /
root@ELF1:/# cp run/media/sda1/openssl.tar.bz2 .
root@ELF1:/# tar -xvf openssl.tar.bz2

交叉编译ZLib

1、下载源码

https://zlib.net/

2、将zlib-1.3.1.tar.gz 拷贝到开发环境/home/elf/work目录下解压

elf@ubuntu:~/work$ tar xvf zlib-1.3.1.tar.gz

3、进入zlib源码目录内,创建一个install文件夹用来放置编译出来的文件

elf@ubuntu:~/work$ cd zlib-1.3.1
elf@ubuntu:~/work/zlib-1.3.1$ mkdir install

4、设置环境变量

elf@ubuntu:~/work/zlib-1.3.1$ . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

5、生成Makefile

elf@ubuntu:~/work/zlib-1.3.1$ ./configure --prefix=$(pwd)/install

6、编译

elf@ubuntu:~/work/zlib-1.3.1$ make

7、安装

elf@ubuntu:~/work/zlib-1.3.1$ make install

8、在install目录下生成文件

elf@ubuntu:~/work/zlib-1.3.1/install$ ls
include  lib  share

9、将install目录下的文件打包

elf@ubuntu:~/work/zlib-1.3.1/install$ tar -cvjf zlib.tar.bz2 *

10、拷贝zlib.tar.bz2到ELF 1开发板根目录下解压

root@ELF1:~# cd /
root@ELF1:/# cp run/media/sda1/zlib.tar.bz2 .
root@ELF1:/# tar -xvf zlib.tar.bz2

交叉编译libwebsockets

1、下载源码

https://github.com/warmcat/libwebsockets

2、将libwebsockets-main.zip拷贝到开发环境/home/elf/work目录下解压

elf@ubuntu:~/work$ unzip libwebsockets-main.zip

3、新建目录

elf@ubuntu:~/work$ cd libwebsockets-main/
elf@ubuntu:~/work/libwebsockets-main$ mkdir build
elf@ubuntu:~/work/libwebsockets-main$ mkdir install

4、修改CMakeLists.txt文件

elf@ubuntu:~/work/libwebsockets-main$ cd build
elf@ubuntu:~/work/libwebsockets-main/build$ vi ../CMakeLists.txt

在第74行project(libwebsockets C)下面添加如下内容

#设置openssl的库头文件
set(OPENSSL_INCLUDE_DIR  "/home/elf/work/openssl-1.1.1c/install/include/")
#设置openssl的库路径
set(OPENSSL_SSL_LIBRARY "/home/elf/work/openssl-1.1.1c/install/lib/libssl.so")
#设置openssl的工具库
set(OPENSSL_CRYPTO_LIBRARY "/home/elf/work/openssl-1.1.1c/install/lib/libcrypto.so")

#设置zlib的库头文件
set(ZLIB_INCLUDE_DIR  "/home/elf/work/zlib-1.3.1/install/include/")
#设置openssl的库路径
set(ZLIB_LIBRARY "/home/elf/work/zlib-1.3.1/install/lib/libz.so")
#设置生成库的安装路径
SET(CMAKE_INSTALL_PREFIX "/home/elf/work/libwebsockets-main/install")

添加效果如下图所示

图片

在第1012行指定libcap库的路径,否则编译报错

1011 if (LWS_HAVE_LIBCAP)
1012         set(LIBCAP_LIBRARIES /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/lib/libcap.so)
1013         list(APPEND LIB_LIST_AT_END ${LIBCAP_LIBRARIES} )
1014 endif()

图片

6、执行环境变量

elf@ubuntu:~/work/libwebsockets-main/build$ . /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

7、生成Makefile

elf@ubuntu:~/work/libwebsockets-main/build$ sudo apt-get update
elf@ubuntu:~/work/libwebsockets-main/build$ sudo apt-get install cmake
elf@ubuntu:~/work/libwebsockets-main/build$ cmake ..

8、编译

elf@ubuntu:~/work/libwebsockets-main/build$ make

9、安装

elf@ubuntu:~/work/libwebsockets-main/build$ make install

10、将install目录下的文件打包

elf@ubuntu:~/work/libwebsockets-main/build$ cd ../install/
elf@ubuntu:~/work/libwebsockets-main/install$ ls
bin  include  lib  share
elf@ubuntu:~/work/libwebsockets-main/install$ tar -cvjf libwebsockets.tar.bz2 *

11、拷贝libwebsockets.tar.bz2到ELF 1开发板根目录下解压

root@ELF1:~# cd /
root@ELF1:/# cp run/media/sda1/libwebsockets.tar.bz2 .
root@ELF1:/# tar -xvf libwebsockets.tar.bz2

至此,OpenSSL、ZLib以及libwebsockets这三个核心库已成功部署至ELF 1开发板,期望这一过程和成果能为正在探索嵌入式系统领域的学习者提供实质性的帮助与启发,助力大家在技术的征途上不断前行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

APS为什么是业务、开发、数据和算法的结合体

获取更多资讯,赶快关注上面的公众号吧! 文章目录 一 引言二 业务是灵魂2.1 生产类型2.2 生产模式2.3 生产约束三 开发是支撑3.1 开发语言3.2 技术架构3.3 内存计算3.4 系统集成3.5 系统交互四 数据是基础五 算法是核心5.1 问题建模5.2 算法建模总结APS系统的实施是一个类似阶…

技术心得总结:a 标签实现新标签页打开功能

最近,有用户提出希望在点击菜单项时,能够在新标签页中打开对应的链接功能。这类似于我们常用的右键菜单中的“在新标签页打开链接”功能。经过对需求的分析和代码的查看,我们找到了实现这一功能的方法。 原始实现 最初的跳转实现是通过用户触…

three.js 基础01

1.场景创建 Scene() 2.常用形状集几何体「Geometry」[可设置长宽高等内容,如:new THREE.BoxGeometry(...)] 长方体 BoxGeometry圆柱体 CylinderGeometry 球体SphereGeometry圆锥体ConeGeometry矩形平面 PlaneGeometry 圆面体 CircleGeo…

Linux中文件查找相关命令比较

Linux中与文件定位的命令有find、locate、whereis、which,type。 一、find find命令最强,能搜索各种场景下的文件,需要配合相关参数,搜索速度慢。在文件系统中递归查找文件。 find /path/to/search -name "filename"…

人工智能发展历程了解和Tensorflow基础开发环境构建

目录 人工智能的三次浪潮 开发环境介绍 Anaconda Anaconda的下载和安装 下载说明 安装指导 模块介绍 使用Anaconda Navigator Home界面介绍 Environment界面介绍 使用Jupter Notebook 打开Jupter Notebook 配置默认目录 新建文件 两种输入模式 Conda 虚拟环境 添…

《软件测试52讲》——测试基础知识篇

1 你真的懂测试吗?从“用户登录”测试谈起 从“用户登录”测试谈起,“用户登录”功能作为测试对象 作为测试工程师,你的目标是要保证系统在各种应用场景下的功能是符合设计要求的,所以你需要考虑的测试用例就需要更多、更全面。 …

Java I/O操作

引言 在Java编程中,输入和输出(I/O)操作是必不可少的部分。Java I/O通过一系列流(Stream)类和方法,支持文件操作、控制台输入输出、网络I/O等多种I/O操作。本文将详细介绍Java I/O的基础概念、文件操作、字…

SQL注入攻击

网站是什么工作的? php写的代码电脑不认识,脚本引擎就是做翻译的,把高级代码翻译为机器语言 访问网站的地址,不同的新闻的id是不一样的,就是对应数据库的不同位置 这里面一个ip地址对应三个网站(怎么能对应…

JavaScript领域的五大AI工程利器

五大引领AI工程的JavaScript工具,为欲将LLM融入项目的开发者提供关键资源。 译自Top 5 JavaScript Tools for AI Engineering,作者 Alexander T. Williams。 传统上以在网页开发中扮演角色而闻名的JavaScript,令许多人惊讶的是,它…

CAN测试工具——BUSMASTER

文章目录 推荐理由一、菜单栏Transmit WindowDiagnostics二、Tools推荐理由 BUSMASTER是一个用于设计,监测,分析与模拟CAN网络的开源的开放式总线PC软件. 1) 可以和十几种常用CAN总线硬件兼容。比如:IXXAT、PEAK、Kvaser、CANcase XL等。 2)免费,开源 https://rbei-etas.g…

pandas获取某列最大值的所有数据

第一种方法: 按照某列进行由大到小的排序,然后再进去去重,保留第一个值,最终保留的结果就是最大值的数据 # 由大到小排序 data_frame data_frame.sort_values(bycolumn_a, ascendingFalse)# 按照column_b列去重保留第一条&#…

人工智能在数字病理领域的最新进展|顶刊速递·24-06-14

小罗碎碎念 文献主题:人工智能在【数字病理】领域的最新进展 今天在写这篇推文的时候,脑子里就一个念头——大模型的风,终于还是卷到了病理学领域。 这是一个好事哈,如果我们搞病理研究的,也能有一个像Chatgpt一样的工…

如何使用 pip 卸载所有已安装的 Python 包?

在开发过程中,我们可能会安装许多 Python 包,有时需要彻底清理环境,以便从头开始或者解决冲突问题。下面将介绍如何使用 pip 命令卸载所有已安装的 Python 包。 一、列出所有已安装的包 首先,需要列出当前环境中所有已安装的包。…

开源模型应用落地-LangChain高阶-LCEL-表达式语言(七)

一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么&…

树状数组练习

先看一下最后一题&#xff0c;这是一个树状数组的题目&#xff0c;那就水一下吧,但是由于没有注意问题&#xff0c;wa了很多次 const int N (int)1e5 5; int n; int flag[N]; int dp[N]; class Solution { public:vector<int> countOfPeaks(vector<int>& num…

【秋招突围】2024届秋招笔试-小红书笔试题-第二套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

意大利罗马3日自由行攻略

欢迎关注「苏南下」 在这里分享我的旅行和影像创作心得 今天来和大家聊聊我个人很喜欢的一座城市—意大利罗马。 作为意大利的首都&#xff0c;罗马自公元前753年建成至今&#xff0c;有超过2700年的历史&#xff0c;被誉为“永恒之城”。走在罗马街头&#xff0c;几乎看不到一…

使用 Python 进行测试(3)pytest setup

总结 我们前进到更真实的项目&#xff1a; less_basic_project ├── my_awesome_package │ ├── calculation_engine.py │ ├── __init__.py │ ├── permissions.py ├── pyproject.toml └── tests├── conftest.py├── test_calculation_engine.p…

283. 移动零 (Swift版本)

题目描述 最容易想到的解法 从后向前遍历, 发现0就通过交换相邻元素将0移动到最后 class Solution {func moveZeroes(_ nums: inout [Int]) {for index in (0..<nums.count).reversed() {if nums[index] 0 {moveZeroes(&nums, index)}}}func moveZeroes(_ nums: inout …

Mybatis plus join 一对多语法

一对多案例&#xff08;set集合&#xff09; 1. 实体类 题目 package co.yixiang.exam.entity;import co.yixiang.domain.BaseDomain; import co.yixiang.exam.config.CustomStringListDeserializer; import com.baomidou.mybatisplus.annotation.TableField; import com.fa…