交叉编译是在一个平台上编译另外一个平台可用的应用程序,此时可以想象,另外一个平台上的系统库不同,所以我们要指定编译时使用的系统库。另外一个平台上运行环境不同,内存的大小端等,所以我们要使用单独编译工具。
即分别设置 SYSROOT 和 C_COMPILER / CXX_COMPILER
编译linaro环境下的三方库
这里介绍使用交叉编译的方式,编译三方库的过程。
一般流程
正常地,我们为cmake设置好要用的工具链,系统环境,以及编译输出的库路径,直接cd build && cmake .. && make install
即可。
- 创建一个 aarch64.toolchain.cmake 文件,并写入如下内容。(路径按实际情况修改)
cmake_minimum_required(VERSION 2.8.0)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(TOOLCHAIN_DIR /usr/local/arm/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu)
set(CMAKE_SYSROOT /usr/local/arm/sysroot)
set(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++)
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)
- 创建一个build.sh,并写入如下内容。
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../aarch64.toolchain.cmake -DCMAKE_INSTALL_PREFIX=../opt ..
make install
- 查看输出结果
tree opt
,正常应该可以看到你想要的目录树结构。
确认后,就可以将opt目录直接拷贝走,拿去使用了。
当然,还有一些三方库是没有这么容易编译的。
部分三方库编译
opencv 编译
原本按照上面的一般流程,opencv是可能编译失败的,或者说这里首先要清晰我们的目标。
可能失败的原因是,opencv有些模块依赖很多其他的库,而我们提供的 $CMAKE_SYSROOT
目录下如果找不到这些库,就会导致编译失败。
但是,我们的目标可能只是使用opencv的核心库,如opencv_video这样的库,我们是不打算使用的。所以直接忽略他,不进行编译即可。
- 同一般方法的1 2步骤,发现最后一步
make install
发生错误,即缺少一部分库,阻止了编译的继续。 - 调整编译选项,只保留主要的核心库。
ccmake build
保留图示几项,其中opencv_world是把要生成的so打包成一个。
按回车是修改,修改完成后,按 c 是生成配置。
完成之后,即可再进入build目录 make install