交叉编译工具链搭建
工具链下载
解包与环境变量添加
tar -xkvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar
解包得到的工具链我选择复制到
/opt/toolchain/aarch64-linux-gnu/
目录下
使用Vim编辑 ~/.bashrc
添加以下内容,注意修改${username}字段
#Cmake-toolchain
export TOOLCHAIN=aarch64-linux-gnu
export TOOLCHAIN_HOME=/opt/toolchain/${TOOLCHAIN}
export PATH="${TOOLCHAIN_HOME}/bin:${PATH}"
运行
source ~/.bashrc
或直接重启terminal,完成环境变量的添加。
进行交叉编译
首先交叉编译 openssl 库,这一部分工作可以参考我交叉编译 openssh 写的博客:
目前还没有写完发出来
编译完成后,执行make install 并记录目标目录备用。
接下来克隆workflow仓库。
git clone https://github.com/sogou/workflow.git --recursive
如果git速度过慢,可以设置代理,这里需要代理软件开启允许局域网连接,我使用了统一局域网下的win11系统下的 某2ray某 软件作为代理则IP为win11主机IP,port根据 某2ray某 的设置确定
git config --global http.https://github.com.proxy socks5://${IP}:${PROT}
然后执行交叉编译指令,这里利用CMAKE_TOOLCHAIN_FILE方法进行交叉编译,首先再workflow目录下创建aarch64.cmake文件,文件内容为:
#指定交叉编译器路径
set(TOOLSCHAIN_PATH "/opt/toolchain/aarch64-linux-gnu/")
set(TOOLCHAIN_HOST "${TOOLSCHAIN_PATH}bin/aarch64-linux-gnu")
#指定嵌入式系统的编译时寻找include和lib的路径(修改为"${dir}/usr/include"和"${dir}/usr/lib"),可不设置
# set(SYSROOT_PATH "/home/shawntao/Backup/arm-use")
# message(STATUS "Using sysroot path: ${SYSROOT_PATH}")
set(TOOLCHAIN_CC "${TOOLCHAIN_HOST}-gcc")
set(TOOLCHAIN_CXX "${TOOLCHAIN_HOST}-g++")
#告诉cmake是进行交叉编译
set(CMAKE_CROSSCOMPILING TRUE)
# Define name of the target system
set(CMAKE_SYSTEM_NAME "Linux")
# Define the compiler
set(CMAKE_C_COMPILER ${TOOLCHAIN_CC})
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_CXX})
#库文件和头文件优先查找的路径
set(CMAKE_FIND_ROOT_PATH "${SYSROOT_PATH}" "${CMAKE_PREFIX_PATH}" "${TOOLSCHAIN_PATH}")
# search for programs in the build host directories
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
修改上述文件中的交叉编译工具链路径(修改成大家linux系统中工具链的实际路径)。
随后修改${dir}/workflow/src下CMakeLists.txt文件前几行为(这里的操作是为了让cmake找到之前交叉编译好的openssl):
cmake_minimum_required(VERSION 3.6)
if (NOT CMAKE_SYSTEM_NAME STREQUAL "Android")
if(CMAKE_CROSSCOMPILING)
message(STATUS "CORSS COMPILE START")
message(STATUS "openssl path is: ${OPENSSL_DIR}")
set(OPENSSL_INCLUDE_DIR "${OPENSSL_DIR}/include")
set(OPENSSL_LINK_DIR "${OPENSSL_DIR}/lib")
link_directories(${OPENSSL_LINK_DIR} ${INC_DIR}/workflow)
else ()
find_package(OpenSSL REQUIRED)
endif ()
endif ()
include_directories(${OPENSSL_INCLUDE_DIR} ${INC_DIR}/workflow)
修改完成后,cd到workflow目录下,运行以下指令进行编译。
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../aarch64.cmake -DOPENSSL_DIR="/home/shawntao/Backup/arm-use/install/openssl" ..
make -j
注意修改${OPENSSL_DIR}变量:为openssl库交叉编译完成后,make install执行后的目标路径(上面让大家记录备用的路劲),我这里目录如下图所示
运行make -j之后如果无报错则编译成功,编译成功的文件位于: ${dir}/workflow/_include目录和 ${dir}/workflow/_lib目录下
之后就可以利用交叉编译好的workflow进行后续开发了。
记得将编译好的文件拷贝到开发板(拷贝_lib文件夹下的 .so 文件至/usr/lib下即可)。
我这里运行了一个1412小姐姐大佬给的 helloworld demo。
再立个FLAG:后续利用workflow的开发过程,我也会尽量记录下来,希望能够对大家有所帮助。