aarch64-linux交叉编译libcurl带zlib和openssl

交叉编译libcurl需要依赖zlib和openssl
需要先用aarch64工具链编译zlib和openssl

aarch64-linux环境搭建

下载工具链

  1. gcc用于执行交叉编译 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
  2. sysroot是交叉版本的库文件集合 sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu.tar.xz

解压在同一个文件夹下

tar -xJvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar -xJvf sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu.tar.xz

在这里插入图片描述

配置cmake工具链

配置.cmake工具链文件aarch64-linux-gnueabi.toolchain.cmake

当前文件夹下新建文件aarch64-linux-gnueabi.toolchain.cmake,内容为

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)set(CMAKE_SYSROOT <sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu的实际路径>)set(tools <gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu的实际路径>)
set(CMAKE_C_COMPILER ${tools}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-linux-gnu-g++)set(CMAKE_C_FLAGS "-O2 -g -Wa,--noexecstack -fexpensive-optimizations -frename-registers -ftree-vectorize -finline-functions -finline-limit=64 -Wno-error=maybe-uninitialized -Wno-error=unused-result")
set(CMAKE_CXX_FLAGS "-O2 -g -Wa,--noexecstack -fexpensive-optimizations -frename-registers -ftree-vectorize -finline-functions -finline-limit=64 -Wno-error=maybe-uninitialized -Wno-error=unused-result")
set(CMAKE_LDFLAGS_FLAGS "-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed")set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
  • CMAKE_SYSROOT变量设置sysroot文件夹的路径,该文件夹是交叉编译版本对应的库文件以及头文件所在
  • tools变量设置gcc交叉编译链的顶层路径,该文件夹包含交叉编译链工具gcc、g++、ld、as等工具
  • CMAKE_C_COMPILER变量设置gcc文件路径
  • CMAKE_CXX_COMPILER设置g++文件路径
  • CMAKE_C_FLAGS变量设置编译c文件选项
  • CMAKE_CXX_FLAGS变量设置编译C++文件选项
  • CMAKE_LDFLAGS_FLAGS变量指定链接选项
  • CMAKE_FIND_ROOT_PATH_MODE_PROGRAM对find_program()产生影响,设为NEVER表示不在CMAKE_FIND_ROOT_PATH下进行查找,对于这个变量来说,一般都是调用宿主机的程序,所以一般都设置成NEVER
  • CMAKE_FIND_ROOT_PATH_MODE_LIBRARY对find_library()起作用,表示在链接的时候的库的相关选项,因此这里需要设置成ONLY来保证我们的库是在交叉环境中找的
  • CMAKE_FIND_ROOT_PATH_MODE_INCLUDE对find_path()和FIND_FILE()起作用,一般来说也是ONLY保证头文件是在交叉环境中找的
  • CMAKE_FIND_ROOT_PATH_MODE_PACKAGE对find_package()起作用,设为ONLY表示只在CMAKE_FIND_ROOT_PATH查找包,官方文档

该文件配置好后,就可以在编译时指定CMAKE_TOOLCHAIN_FILE变量为该文件,使用cmake编译,如

mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=<aarch64-linux-gnueabi.toolchain.cmake文件的实际路径>
cmake --build .

交叉编译链自带了一些基础的库,此时已经可以用cmake编译一些简单的程序
在这里插入图片描述

测试交叉编译工具链

写个cmake工程测试一下

mkdir test
cd test
vi main.cpp

main.cpp内容为

#include <iostream>using namespace std;int main()
{cout << "CPLUSPLUS VERSION is " << __cplusplus << endl;return 0;
}
vi CMakeLists.txt

CMakeLists.txt内容为

cmake_minimum_required(VERSION 3.0)
project(test_toolchain)
set(CMAKE_CXX_STANDARD 14)
add_executeble(${PROJECT_NAME} main.cpp)

测试编译:

mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=<aarch64-linux-gnueabi.toolchain.cmake的实际路径>
cmake --build .# 编译成功后,用file命令查看可执行文件的架构可以发现已经是aarch64架构,需要push到aarch64开发板上才能运行
file test_toolchain
test_toolchain: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=7e834ab1fb37804e52de63d2d7404878b5cca044, with debug_info, not stripped

交叉编译libcurl

libcurl支持cmake编译,因为libcurl编译还依赖zlib和openssl,直接交叉编译libcurl会失败,所以先交叉编译这两个库

交叉编译zlib

wget https://www.zlib.net/zlib-1.3.tar.gz
tar -xzvf zlib-1.3.tar.gz
cd zlib-1.3/# 把gcc所在bin文件夹加到环境变量,要填绝对路径,添加成功的话输入aarch按Tab键会有补全提示
export PATH="你的存放路径/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin":$PATH# 设置CC变量,--sysroot要写绝对路径
export CC="aarch64-linux-gnu-gcc --sysroot=你的存放路径/sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu"# 配置生成Makefile,安装到交叉编译链的sysroot/usr路径下,路径根据实际情况变动
./configure --prefix=$(pwd)/../sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu/usr# 使用多核编译
make -j32# 安装到sysroot/usr,安装成功之后,交叉编译工具链路径下会新增libz库文件和头文件
make install

交叉编译openssl

wget https://ftp.openssl.org/source/openssl-1.1.1v.tar.gz
tar -xzvf openssl-1.1.1v.tar.gz
cd openssl-1.1.1v/# 把gcc所在bin文件夹加到环境变量,要填绝对路径,添加成功的话输入aarch按Tab键会有补全提示
export PATH="你的存放路径/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin":$PATH# 设置CC变量,--sysroot要写绝对路径
export CC="aarch64-linux-gnu-gcc --sysroot=你的存放路径/sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu"# 配置指定安装到交叉工具链的/usr目录下
./config  no-asm --prefix=$(pwd)/../sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu/usr# aarch64不认识-m64选项,将Makefile中含有-m64的几行注释
#CNF_CFLAGS=-pthread -m64
#CNF_CXXFLAGS=-std=c++11 -pthread -m64# 使用多核编译
make -j32# 安装到sysroot/usr,安装成功之后,交叉编译工具链路径下会新增libssl和libcrypto库文件和头文件
make install

在这里插入图片描述

在这里插入图片描述

交叉编译libcurl

依赖都安装完成,编译libcurl就简单了

wget https://curl.se/download/curl-8.2.1.tar.gz
tar -xzvf curl-8.2.1.tar.gz
cd curl-8.2.1/mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=实际存放的路径/aarch64-linux-gnueabi.toolchain.cmake
make -j32

编译完成在build目录下生成了lib文件夹,该文件夹下即libcurl交叉编译的aarch64目标库,完!

在这里插入图片描述

参考

  • Linux下arm交叉编译工具链的安装
  • CMAKE_FIND_ROOT_PATH_MODE_PACKAGE
  • cmake-toolchains(7)
  • CMake交叉编译配置
  • cmake:交叉编译

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS逆向进阶:iOS进程间通信方案深入探究与local socket介绍

在移动应用开发中&#xff0c;进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是一项至关重要的技术&#xff0c;用于不同应用之间的协作和数据共享。在iOS生态系统中&#xff0c;进程和线程是基本的概念&#xff0c;而进程间通信方案则为应用的…

在 Spring Boot 中集成 MinIO 对象存储

MinIO 是一个开源的对象存储服务器&#xff0c;专注于高性能、分布式和兼容S3 API的存储解决方案。本文将介绍如何在 Spring Boot 应用程序中集成 MinIO&#xff0c;以便您可以轻松地将对象存储集成到您的应用中。 安装minio 拉取 minio Docker镜像 docker pull minio/minio创…

Linux:内核解压缩过程简析

文章目录 1. 前言2. 背景3. zImage 的构建过程4. 内核引导过程5. 内核解压缩过程6. 内核加压缩过程小结7. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 背景 本文基于 ARM32架构 …

剑指 Offer 62. 圆圈中最后剩下的数字(简单)

题目&#xff1a; class Solution { public:int lastRemaining(int n, int m) {int pos 0;for(int i2;i<n;i){pos (posm)%i;}return pos;} };作者&#xff1a;想吃火锅的木易 链接&#xff1a;详细题解 来源&#xff1a;力扣&#xff08;LeetCode&#xff09;

【微服务部署】07-调用链追踪

文章目录 集成SkyWalking实现调用链追踪1. SkyWalking架构图2. 代码集成SkyWalking 集成SkyWalking实现调用链追踪 1. SkyWalking架构图 Receiver是SkyWalking的入口&#xff0c;支持gRPC和HTTP协议。 SkyWalking内部有分析和查询两个部分 存储方面SkyWalking支持Elasticsearc…

第一个实例:QT实现汽车电子仪表盘

1.实现效果 1.1.视频演示 QT 实现汽车仪表盘 1.2.实现效果截图 2.生成的安装程序 此程序是个windows下的安装程序,可以直接安装,看到汽车仪表盘的实现效果,安装程序从下面链接下载: 【免费】使用QT实现的汽车电子仪表盘,在windows下的安装程序资源-CSDN文库 3.功能概述…

(三)行为模式:6、备忘录模式(Memento Pattern)(C++示例)

目录 1、备忘录模式&#xff08;Memento Pattern&#xff09;含义 2、备忘录模式的UML图学习 3、备忘录模式的应用场景 4、备忘录模式的优缺点 &#xff08;1&#xff09;优点&#xff1a; &#xff08;2&#xff09;缺点 5、C实现备忘录模式的实例 1、备忘录模式&#…

数学建模--整数规划匈牙利算法的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 #整数规划模型--匈牙利算法求解 """ 整数规划模型及概念&#xff1a;规划问题的数学模型一般由三个因素构成 决策变量 目标函数 约束条件&#xff1b;线性规划即以线性函数为目标函数&a…

密码算法、密钥体系---安全行业基础篇1

一、密码算法 密码算法是一种数学和计算方法&#xff0c;用于保护数据的机密性和安全性。不同的密码算法使用不同的数学原理和技术来加密和解密数据。以下是一些常见的密码算法类型&#xff1a; 1. **对称密码算法&#xff1a;** 特点&#xff1a;相同的密钥用于加密和解密数…

工服穿戴检测联动门禁开关算法

工服穿戴检测联动门禁开关算法通过yolov8深度学习框架模型&#xff0c;工服穿戴检测联动门禁开关算法能够准确识别和检测作业人员是否按照规定进行工服着装&#xff0c;只有当人员合规着装时&#xff0c;算法会发送开关量信号给门禁设备&#xff0c;使门禁自动打开。YOLO的结构…

Maven入门教程(一):安装Maven环境

视频教程&#xff1a;Maven保姆级教程 Maven入门教程(一)&#xff1a;安装Maven环境 Maven入门教程(二)&#xff1a;idea/Eclipse使用Maven Maven入门教程(三)&#xff1a;Maven语法 Maven入门教程(四)&#xff1a;Nexus私服 Maven入门教程(五)&#xff1a;自定义脚手架 Maven项…

近年GDC服务器分享合集(四): 《火箭联盟》:为免费游玩而进行的扩展

如今&#xff0c;网络游戏采用免费游玩&#xff08;Free to Play&#xff09;加内购的比例要远大于买断制&#xff0c;这是因为前者能带来更低的用户门槛。甚至有游戏为了获取更多的用户&#xff0c;选择把原来的买断制改为免费游玩&#xff0c;一个典型的例子就是最近的网易的…

c++图论免费ppt,简单深度理解图论

本篇博文想分享一个ppt,是帮助大家简单深度理解c图论. 作者承诺&#xff1a;分享的东西没有病毒&#xff0c;是资料。 分享的东西一个是ppt,ppt里面是150页的&#xff0c;里面将带领大家简单深度理解c图论&#xff0c;还有一个就是里面例题的数据&#xff0c;大家可以按照数据…

Qt应用开发(基础篇)——输入对话框 QInputDialog

一、前言 QInputDialog类继承于QDialog&#xff0c;是一个简单方便的对话框&#xff0c;用于从用户获取单个值。 对话框窗口 QDialog QInputDialog输入对话框带有一个文本标签、一个输入框和标准按钮。输入内容可以字符、数字和选项&#xff0c;文本标签用来告诉用户应该要输入…

MyBatis-Plus学习笔记

1.MyBatis-Plus简介&#xff1a; MyBatis-Plus是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyBatis-Plus提供了通用的mapper和service&#xff0c;可以在不编写任何SQL语句的情况下&#xff0c;快速的实现对单…

优化爬虫请求:如何选择合适的爬虫ip轮换策略?

在进行爬虫任务时&#xff0c;使用隧道爬虫ip并采用合适的轮换策略可以提高稳定性和效率。选择合适的隧道爬虫ip轮换策略可以优化您的爬虫请求过程。 1、考量目标网站特点 不同网站对于频繁请求可能有不同限制或反爬机制。 了解目标网站是否存在IP封禁、验证码等问题&#xff…

swagger 接口测试,用 python 写自动化时该如何处理?

在使用Python进行Swagger接口测试时&#xff0c;可以使用requests库来发送HTTP请求&#xff0c;并使用json库和yaml库来处理响应数据。以下是一个简单的示例代码&#xff1a; import requests import json import yaml# Swagger API文档地址和需要测试的接口路径 swagger_url …

云原生Kubernetes:K8S概述

目录 一、理论 1.云原生 2.K8S 3.k8s集群架构与组件 二、总结 一、理论 1.云原生 &#xff08;1&#xff09;概念 云原生是一种基于容器、微服务和自动化运维的软件开发和部署方法。它可以使应用程序更加高效、可靠和可扩展&#xff0c;适用于各种不同的云平台。 如果…

2分钟搭建FastGPT训练企业知识库AI助理(Docker部署)

我们使用宝塔面板来进行搭建&#xff0c;更方便快捷灵活&#xff0c;争取操作时间只需两分钟 宝塔面板下安装Docker 在【软件商店中】安装【docker管理器】【docker模块】即可 通过Docker安装FastGPT 通过【Docker】【添加容器】【容器编排】创建里新增docker-compose.yaml以下…

oled--SSD1315驱动

OLED 接口方式&#xff08;由硬件电路确定&#xff09;&#xff1a;6800、8080、spi、i2c. 常见的驱动芯片&#xff1a;ssd1306、ssd1315。 oled屏幕的发光原理不同于lcd&#xff0c;上电后无法直接显示&#xff0c;需要初始化后才能正常显示。 SSD1315手册资料 SSD1315是一款…