• 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
    
    • 1
    • 2

    解压在同一个文件夹下

    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
    
    • 1
    • 2

    在这里插入图片描述

    配置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 )
    
    set(tools )
    set(CMAKE_C_COMPILER ${tools}/bin/aarch64-linux-gnu-gcc)
    set(CMAKE_CXX_COMPILER ${tools}/bin/aarch64-linux-gnu-g++)
    
    set(CMAKE_C_FLAGS "-fPIC -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 "-fPIC -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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 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 .
    
    • 1
    • 2
    • 3
    • 4

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

    测试交叉编译工具链

    写个cmake工程测试一下

    mkdir test
    cd test
    vi main.cpp
    
    • 1
    • 2
    • 3

    main.cpp内容为

    #include 
    
    using namespace std;
    
    int main()
    {
        cout << "CPLUSPLUS VERSION is " << __cplusplus << endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    vi CMakeLists.txt
    
    • 1

    CMakeLists.txt内容为

    cmake_minimum_required(VERSION 3.0)
    project(test_toolchain)
    set(CMAKE_CXX_STANDARD 14)
    add_executeble(${PROJECT_NAME} main.cpp)
    
    • 1
    • 2
    • 3
    • 4

    测试编译:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    交叉编译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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    交叉编译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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    在这里插入图片描述

    交叉编译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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    在这里插入图片描述

    参考

  • 相关阅读:
    38-数组 _ 一维数组
    Google play 应用下架、封号常见原因:8.3/10.3分发协议及恶意软件政策问题浅析
    【踩坑专栏】 Could not write JSON: No serializer found for class
    竣达技术 | 8路IO模块模拟量采集 通讯信号检测 继电器输出控制 可接入漏水和声光
    从零开始,开发一个 Web Office 套件(13):删除、替换已选中文字
    云计算 3月15号(linux的权限管理 进程管理 管道重定向 磁盘管理 文件查找 软件管理 计划任务 web服务器 配置文件)
    统计遗传学:第五章,多基因评分PGS
    三方检测-服务及服务器扫描问题及处理方案
    如何在 Windows 中卸载 SQL Server?
    利用微调的deberta-v3-large来预测情感分类
  • 原文地址:https://blog.csdn.net/to_free/article/details/132636503