交叉编译工具可以在自己的开发电脑上编译嵌入式控制器的可执行文件,编译后将可执行文件传到控制器中,直接可以在控制器中运行。

1.下载交叉编译工具链

由以下地址下载交叉编译工具链。
http://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/aarch64-linux-gnu/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz

2.提取工具链

将下载之后的压缩包解压到本地

3.设置环境变量(可选)

解压之后,还需要设置环境变量,才能正常使用交叉编译工具链

执行下面命令
gedit ~/.bashrc
打开.bashrc文件,在文件中加入下面语句
export PATH=$PATH: [本地路径]/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin
路径需要根据自己电脑的路径进行设置。

4.测试

重启电脑,执行下面的命令来验证工具链是否安装成功。
aarch64-linux-gnu-gcc -v

5. 编译生成Xavier下使用的库文件的动态库

在Xavier中,找到已经编译成功的可执行文件,比如perception。复制copylib.sh到当前目录下,在终端中执行
./copylib.sh perception
在当前文件下会生成包含可执行程序所使用的所有动态库的lib文件夹。

6. 拷贝Xavier下使用的库的include文件

一般在目录/usr/include下,比如opencv,opencv2,boost,eigen3,Eigen,pcl等。

7. 修改下载好的交叉编译工具链

将步骤1生成的动态库拷贝到 [本地目录]/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib
将步骤2的头文件拷贝到 [本地目录]/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/include中

8. 修改cmakelists.txt

(1)将以下内容复制到project(perception)之前,指定编译器:

#告诉cmake是进行交叉编译
set(CMAKE_CROSSCOMPILING TRUE)
# Define name of the target system
set(CMAKE_SYSTEM_NAME "Linux")
set(COMPILER_PATH "/home/xxy/xxy/svn/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu")
#指定交叉编译器路径
set(CMAKE_CXX_COMPILER "${COMPILER_PATH}/bin/aarch64-linux-gnu-g++")

(2)指定编译过程中寻找所需头文件和库文件的地址

include_directories(
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/include/c++/7.3.1
    )
link_directories(
    ${COMPILER_PATH}/aarch64-linux-gnu/lib
    ${COMPILER_PATH}/aarch64-linux-gnu/lib64
    ${COMPILER_PATH}/aarch64-linux-gnu/libc
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/lib
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/lib
    )

(3)添加生成的所需的动态库

target_link_libraries (${PROJECT_NAME}
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/lib/libboost_system.so.1.65.1
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/lib/libboost_thread.so.1.65.1
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/lib/libopencv_core.so.3.3
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/lib/libopencv_highgui.so.3.3
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/lib/libopencv_imgproc.so.3.3
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/lib/libopencv_videoio.so.3.3
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/lib/libopencv_imgcodecs.so.3.3
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/lib/libc.so.6
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/lib/libm.so.6
    ${COMPILER_PATH}/aarch64-linux-gnu/libc/usr/lib/ld-linux-aarch64.so.1
    )

(4)修改文件中所包含的cmakelists
在每个cmakelists中都增加(1)内容,指定编译器

#告诉cmake是进行交叉编译
set(CMAKE_CROSSCOMPILING TRUE)
# Define name of the target system
set(CMAKE_SYSTEM_NAME "Linux")
set(COMPILER_PATH "/home/xxy/xxy/svn/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu")
#指定交叉编译器路径
set(CMAKE_CXX_COMPILER "${COMPILER_PATH}/bin/aarch64-linux-gnu-g++")
  1. 编译
    在修改好的工程下,运行一下命令
mkdir build
cd build
cmake ..
make

即可生成相应的lib库和可执行文件。
6. copylib.sh

#!/bin/bash

LibDir=$PWD"/lib"
Target=$1

lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))

$(mkdir $LibDir)

for Variable in ${lib_array[@]}
do
    cp "$Variable" $LibDir
done
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐