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

news2024/10/7 14:22:30

交叉编译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.coloradmin.cn/o/963235.html

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

相关文章

仿`gRPC`功能实现像调用本地方法一样调用其他服务器方法

文章目录 仿gRPC功能实现像调用本地方法一样调用其他服务器方法 简介单体架构微服务架构RPCgPRC gRPC交互逻辑服务端逻辑客户端逻辑示例图 原生实现仿gRPC框架编写客户端方法编写服务端方法综合演示 仿 gRPC功能实现像调用本地方法一样调用其他服务器方法 简介 在介绍gRPC简介…

双网卡/内外网同时使用2023.09.01

1.双网卡 电脑需要两个网卡&#xff1a;两个网口或者是一个有线网卡加一个无线网卡。 查看网关&#xff1a;如下网口接入网线后&#xff0c;电脑连接WIFI&#xff0c;电脑会显示存在两个网卡正在使用&#xff08;电脑存在两个IP地址&#xff09; 查看本地的路由设置 route p…

无涯教程-JavaScript - NEGBINOMDIST函数

NEGBINOMDIST函数取代了Excel 2010中的NEGBINOM.DIST函数。 描述 该函数返回负二项式分布。 NEGBINOMDIST返回在第number_s次成功之前出现number_f次失败的概率,而成功的恒定概率是概率_s。 该函数与二项式分布相似,不同之处在于成功次数是固定的,而试验次数是可变的。像二项…

详细教程:Stegsolve的下载,jdk的下载、安装以及环境的配置

最近在学习隐写术&#xff0c;下载stegsolve 以及使用stegsolve倒腾了很久&#xff0c;避免朋友们和我一样倒腾了很久&#xff0c;希望此文可以帮到刚在学习隐写的朋友们(win7下使用stegsolve) 文章目录 一、下载stegsolve链接二、jdk的下载三、jdk的安装四、配置环境变量五、检…

Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

面试专题-设计模式 前言 在平时的开发中&#xff0c;涉及到设计模式的有两块内容&#xff0c;第一个是我们平时使用的框架&#xff08;比如spring、mybatis等&#xff09;&#xff0c;第二个是我们自己开发业务使用的设计模式。 面试官一般比较关心的是你在开发过程中&#xff…

​7.1 项目1 学生通讯录管理:文本文件增删改查(C++版本)(自顶向下设计+断点调试) (A)​

C自学精简教程 目录(必读) 作业目标&#xff1a; 这个作业中&#xff0c;你需要综合运用之前文章中的知识&#xff0c;来解决一个相对完整的应用程序。 作业描述&#xff1a; 1 在这个作业中你需要在文本文件中存储学生通讯录的信息&#xff0c;并在程序启动的时候加载这些…

Arcface部署应用实战

1、概述 人脸识别的一个比较常用的网络arcface&#xff0c;依赖于其特殊设计的loss函数&#xff0c;使得模型在训练的时候能够实现类间距离增大&#xff0c;类内的距离不断减小&#xff0c;最终使得所训练的backbone能够获取鉴别性很高的特征&#xff0c;便于人脸识别。 本文…

Git——Windows平台创建gitee私有仓库详解

目录 1. 安装git 2. gitbash配置 2.1 设置 2.2 生成key 2.3 项目管理 2.3.1 本地新建 2.3.2 clone远程仓库的工程到本地改文件 1. 安装git 默认安装。 2. gitbash配置 2.1 设置 打开gitbash&#xff0c;设置用户名和邮箱&#xff1a; git config --global user.name …

Matlab(数值微积分)

目录 1.多项式微分与积分 1.1 微分 1.2 多项式微分 1.3 如何正确的使用Matlab? 1.3.1 Matlab表达多项式 1.3.2 polyval() 多项式求值 1.3.3 polyder()多项式微分 1.4 多项式积分 1.4.1 如何正确表达 1.4.2 polyint() 多项式积分 2.数值的微分与积分 2.1 数值微分 2…

windows server 2019 安装sqlserver2012

在安装前&#xff0c;应先关闭系统防火墙 双击exe 选择【全新SQL Server独立安装或向现有安装添加功能】选项 运行完成后&#xff0c;如无失败或警告&#xff0c;点击确定&#xff0c;如果出现警告&#xff0c;需要处理掉再继续执行 点击下一步 勾选接受许可&#xff0c;点击下…

第一课:使用C++实现图片去水印

1.功能概述 实现图片去水印的方法有很多,下面提供一种基于OpenCV库的C++实现方法。主要思路是利用图像中不同水印区域之间的差异,进行区域提取、重构和合成,从而实现去除水印的效果。 2.具体实现 2.1.导入OpenCV库和头文件 #include <iostream> #include <o…

图 —— 基础概念详解

文章目录 前言1. 顶点、边、阶2. 无向图、有向图、简单图、多重图、完全图&#x1f351; 无向图&#x1f351; 有向图&#x1f351; 简单图&#x1f351; 多重图&#x1f351; 完全图 3. 顶点的度、入度、出度4. 顶点之间的关系、路径、边5. 连通图、子图6. 生成树、生成森林7.…

bazel远程构建(Remote Execution)

原理 既然 ActionResult 可以被不同的 Bazel 任务共享&#xff0c;说明 ActionResult 和 Action 在哪里执行并没有关系。因此&#xff0c;Bazel 在构建时&#xff0c;可以把 Action 发送给另一台服务器执行&#xff0c;对方执行完&#xff0c;向 CAS 上传 ActionResult&#x…

ESLint 中的“ space-before-function-paren ”相关报错及其解决方案

ESLint 中的“ space-before-function-paren ”相关报错及其解决方案 出现的问题及其报错&#xff1a; 在 VScode 中&#xff0c;在使用带有 ESLint 工具的项目中&#xff0c;保存会发现报错&#xff0c;并且修改好代码格式后&#xff0c;保存会发现代码格式依然出现问题&…

SpringBoot 整合 RabbitMQ

1. 创建 SpringBoot 工程 把版本改为 2.7.14 引入这两个依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springfr…

在Mac 上安装flutter 遇到的问题

准备工作 1、升级Macos系统为最新系统 2、安装最新的Xcode 3、电脑上面需要安装brew https://brew.sh/ 4、安装chrome浏览器(开发web用) 下载Flutter、配置Flutter环境变量、配置Flutter镜像 下载Flutter SDK https://docs.flutter.dev/release/archive?tabmacos 根据自己…

吐槽丨为什么我依然喜欢用旧版UWP网易云音乐

实在忍不住吐槽一下 左侧&#xff1a;网易云音乐 真UWP版&#xff0c;UI间距宽松&#xff0c;页面清爽。 右侧&#xff1a;网易云音乐 假PC移植版&#xff0c;文字密集&#xff0c;显得杂乱无章&#xff0c;列表行距太窄。 左侧&#xff1a;真UWP版页面UI自适配&#xff0c;随…

GEEMAP 基本操作(三)如何对图像进行 3D 叠加显示 (图像混合 blend)

最近在 GIS 界有很多大神在讨论如何将图像下面混合一幅地形数据&#xff0c;这样看起来是 3D 的比较酷炫。 比如这样&#xff1a; 以上图片来自网络&#xff0c;是在专业软件中制作的。 GEEMAP 中是否可行呢&#xff1f;当然没问题&#xff0c;使用 blend 即可。下面的例子请笑…

Flutter启动页

效果图 import dart:async; import package:flutter/cupertino.dart; import package:flutter/material.dart; import jumpPage.dart;class TransitPage extends StatefulWidget {const TransitPage({super.key});overrideState<TransitPage> createState() > _Trans…

Gateway的服务网关

Gateway服务网关 Gateway网关是我们服务的守门神&#xff0c;所有微服务的统一入口。 网关的核心功能特性&#xff1a; 请求路由 权限控制 限流 架构如下&#xff1a; gateway使用 引入依赖 创建gateway服务&#xff0c;引入依赖 <!--网关--> <dependency>…