交叉编译libcurl需要依赖zlib和openssl
需要先用aarch64工具链编译zlib和openssl
aarch64-linux环境搭建
下载工具链
- gcc用于执行交叉编译 gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
- 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:交叉编译