Cmake使⽤教程-交叉编译
Cmake Cross Compile UserGuide
1. 设置系统和⼯具链
对于交叉编译,CMake并不知道⽬标系统是什么,所以需要设置⼀些CMake变量来告知CMake,
CMAKE_SYSTEM_NAME:即⽬标系统名,这⾥是Linux
CMAKE_SYSTEM_PROCESSOR :⽬标系统的处理器名,这⾥是arm
对于⼯具链,则是通过下⾯2个变量来定位,
CMAKE_C_COMPILER:C编译器的可执⾏⽂件名称
CMAKE_CXX_COMPILER:C++编译器的可执⾏⽂件名称
这些变量可以在调⽤CMake时通过命令⾏传递,但是这种做法容易出错,⽽且⽤起来不⽅便,所以CMake提供了⼯具链⽂件的⽅式来传递这些变量信息。
2. ⼯具链⽂件
我们在⼯程⾥新建⼀个⽂件叫arm_ake,放置位置如下(也可以放在别的地⽅),
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(tools /home/wh/work/cross_compile/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)
注意:
上述命令必须写⼊脚本中,使⽤ -DCMAKE_TOOLCHAIN_ake 的⽅式使⽤。不能直接写⼊ 或使⽤ake) 。
set(CMAKE_SYSTEM_NAME Linux):该指令必须存在,其⽬的是设置⽬标机使⽤的操作系统名称,⽀持
Linux,QNX,WindowsCE,Android等。如果没有操作系统,那么就写 Generic。执⾏该指令后,cma
ke 变量
CMAKE_CROSSCOMPILING 会⾃动被设置为 TRUE,此时 cmake 就会“知道“现在执⾏的是交叉编译;
tools是本⼈使⽤的交叉⼯具链路径,可以根据⾃⼰的实际⽂件来做修改。
3. 编译
使⽤CMake的变量CMAKE_TOOLCHAIN_FILE来指定⼯具链⽂件,cd到build⽬录,然后执⾏下⾯的命令,
# 注意,⼯具链⽂件的指定⼀定要紧跟cmake命令之后,不能放到 .. 后⾯
cmake -DCMAKE_TOOLCHAIN_FILE=../arm_ake -DCMAKE_INSTALL_PREFIX=/XXX/XXX ..
使⽤make开始安装编译源代码
make # 编译源代码
make DESTDIR=/install/directory install # 配置安装路径为指定路径
使⽤file命令去查看这个⽂件,可以看到其运⾏平台是32位ARM处理器上的Linux系统,
file executablecmake如何使用
使⽤⼯具链⽂件的好处就是只要编写⼀遍,然后在任意地⽅只需要使⽤CMAKE_TOOLCHAIN_FILE去指定其位置就可以了,⾮常⽅便。
4. 其他说明
通常,我们在开发时,需要使⽤系统库或第三⽅库的功能,在⽣成可执⾏⽂件时,将其进⾏链接。cmake 提供了
FIND_PROGRAM(),FIND_LIBRARY(), FIND_FILE(), FIND_PATH()和FIND_PACKAGE()实现相应的查功能。如果我们在进⾏交叉编译时使⽤了上述指令,那么并不能⽣成可执⾏⽂件。因为默认情况下,上述指令查的是主机上的相关⽂件,其并不适⽤于⽬标机器。还好,cmake 为我们提供了相应的变量:
CMAKE_FIND_ROOT_PATH设置其值为⼀系列的⽬录set(CMAKE_FIND_ROOT_PATH path1 path2 path3 ...),这样在执⾏FIND_XXX()指令时就会从这⼀系列的⽬录中进⾏查。
跟随该变量的有下述 3 个变量,它们的值为 NEVER 、 ONLY 或 BOTH:
CMAKE_FIND_ROOT_PATH_MODE_PROGRAM:如果设置为 NEVER,那么CMAKE_FIND_ROOT_PATH就不会对FIND_PROGRAM()产⽣影响,FIND_PROGRAM()不会在CMAKE_FIND_ROOT_PATH指定的⽬录中寻;如果设置为 ONLY,那么FIND_PROGRAM()只会
从CMAKE_FIND_ROOT_PATH指定的⽬录中寻;如果设置为 BOTH,那么FIND_PROGRAM()会优先从CMAKE_FIND_ROOT_PATH指定的⽬录中
寻,再从默认的⽬录中寻。
因为FIND_PROGRAM()⼤部分情况下⽤于寻可执⾏程序,给后续的EXECUTE_PROCESS()或ADD_CUSTOM_COMMAND()指令使⽤。并且,只有主机在⽣成编译⽂件时使⽤该可执⾏程序。因此通常设置CMAKE_FIND_ROOT_PATH_MODE_PROGRAM为
NEVER,set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER);
CMAKE_FIND_ROOT_PATH_MODE_LIBRARY:由于在进⾏交叉编译,所以只能使⽤FIND_LIBRARY()查符合⽬标机器的库⽂件,因此设置该变量值为ONLY(set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)),表⽰只从CMAKE_FIND_ROOT_
PATH指定的⽬录中查;
CMAKE_FIND_ROOT_PATH_MODE_INCLUDE:同上,将其值设置为 ONLY。
Reference
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论