对于交叉编译,CMake并不知道目标系统是什么,所以需要设置一些CMake变量来告知CMake,
- CMAKE_SYSTEM_NAME:即目标系统名,这里是Linux
- CMAKE_SYSTEM_PROCESSOR :目标系统的处理器名,这里是arm
对于工具链,则是通过下面2个变量来定位,
- CMAKE_C_COMPILER:C编译器的可执行文件名称
- CMAKE_CXX_COMPILER:C++编译器的可执行文件名称
这些变量可以在调用CMake时通过命令行传递,但是这种做法容易出错,而且用起来不方便,所以CMake提供了工具链文件的方式来传递这些变量信息。
我们在工程里新建一个文件叫arm_linux_setup.cmake,放置位置如下(也可以放在别的地方),
注意:
- 上述命令必须写入脚本中,使用 -DCMAKE_TOOLCHAIN_FILE=xxx.cmake 的方式使用。不能直接写入 CMakeLists.txt 或使用 include(xx.cmake) 。
- set(CMAKE_SYSTEM_NAME Linux):该指令必须存在,其目的是设置目标机使用的操作系统名称,支持Linux,QNX,WindowsCE,Android等。如果没有操作系统,那么就写 Generic。执行该指令后,cmake 变量CMAKE_CROSSCOMPILING 会自动被设置为 TRUE,此时 cmake 就会“知道“现在执行的是交叉编译;
tools是本人使用的交叉工具链路径,可以根据自己的实际文件来做修改。
使用CMake的变量CMAKE_TOOLCHAIN_FILE来指定工具链文件,cd到build目录,然后执行下面的命令,
使用make开始安装编译源代码
使用file命令去查看这个文件,可以看到其运行平台是32位ARM处理器上的Linux系统,
使用工具链文件的好处就是只要编写一遍,然后在任意地方只需要使用CMAKE_TOOLCHAIN_FILE去指定其位置就可以了,非常方便。
通常,我们在开发时,需要使用系统库或第三方库的功能,在生成可执行文件时,将其进行链接。cmake 提供了 和 实现相应的查找功能。如果我们在进行交叉编译时使用了上述指令,那么并不能生成可执行文件。因为默认情况下,上述指令查找的是主机上的相关文件,其并不适用于目标机器。还好,cmake 为我们提供了相应的变量:
设置其值为一系列的目录,这样在执行 指令时就会从这一系列的目录中进行查找。
跟随该变量的有下述 3 个变量,它们的值为 NEVER 、 ONLY 或 BOTH:
如果设置为 NEVER,那么 就不会对 产生影响, 不会在 指定的目录中寻找;如果设置为 ONLY,那么 只会从 指定的目录中寻找;如果设置为 BOTH,那么 会优先从 指定的目录中寻找,再从默认的目录中寻找。
因为 大部分情况下用于寻找可执行程序,给后续的 或 指令使用。并且,只有主机在生成编译文件时使用该可执行程序。因此通常设置 为 NEVER,;
由于在进行交叉编译,所以只能使用 查找符合目标机器的库文件,因此设置该变量值为ONLY,表示只从 指定的目录中查找;
同上,将其值设置为 ONLY。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/14403.html