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
shell 复制代码
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

解压在同一个文件夹下

shell 复制代码
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,内容为

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编译,如

shell 复制代码
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内容为

cpp 复制代码
#include <iostream>

using namespace std;

int main()
{
    cout << "CPLUSPLUS VERSION is " << __cplusplus << endl;
    return 0;
}
复制代码
vi CMakeLists.txt

CMakeLists.txt内容为

cmake 复制代码
cmake_minimum_required(VERSION 3.0)
project(test_toolchain)
set(CMAKE_CXX_STANDARD 14)
add_executeble(${PROJECT_NAME} main.cpp)

测试编译:

shell 复制代码
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

shell 复制代码
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

shell 复制代码
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目标库,完!

参考

相关推荐
xq5148631 小时前
Linux系统下安装mongodb
linux·mongodb
柒七爱吃麻辣烫1 小时前
在Linux中安装JDK并且搭建Java环境
java·linux·开发语言
孤寂大仙v2 小时前
【Linux笔记】——进程信号的产生
linux·服务器·笔记
深海蜗牛2 小时前
Jenkins linux安装
linux·jenkins
愚戏师2 小时前
Linux复习笔记(三) 网络服务配置(web)
linux·运维·笔记
JANYI20183 小时前
嵌入式MCU和Linux开发哪个好?
linux·单片机·嵌入式硬件
熊大如如3 小时前
Java NIO 文件处理接口
java·linux·nio
晚秋大魔王3 小时前
OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——nettle库
linux·开源·harmonyos
农民小飞侠3 小时前
ubuntu 24.04 error: cannot uninstall blinker 1.7.0, record file not found. hint
linux·运维·ubuntu
某不知名網友3 小时前
Linux 软硬连接详解
linux·运维·服务器