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目标库,完!

参考

相关推荐
watermelonoops1 小时前
Deepin和Windows传文件(Xftp,WinSCP)
linux·ssh·deepin·winscp·xftp
疯狂飙车的蜗牛2 小时前
从零玩转CanMV-K230(4)-小核Linux驱动开发参考
linux·运维·驱动开发
远游客07134 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<4 小时前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传
jingyu飞鸟4 小时前
centos-stream9系统安装docker
linux·docker·centos
超爱吃士力架4 小时前
邀请逻辑
java·linux·后端
cominglately7 小时前
centos单机部署seata
linux·运维·centos
魏 无羡7 小时前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse7 小时前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
木子Linux8 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算