CMake是可以轻松进行交叉编译的,只需要编写一个工具链配置文件(toolchain file),然后在使用命令行配置CMake工程时,指定-DCMAKE_TOOLCHAIN_FILE=<toolchain_filename>
参数即可。
这一过程类似于autotools中,给./configure
脚本指定--host
、--target
这两个参数;但CMake与autotools的区别在于,交叉编译的相关参数写在配置文件中。
咱举个例子:跨平台编译
想要在Linux下交叉编译Windows应用程序,则先在工程目录创建一个文件,名为win32-cross-build.cmake
:
1 |
|
然后配置工程(假设构建目录为工程目录下的build
):
1 |
|
稍等片刻,CMake会输出一系列日志。从日志中可以看到,CMake选中了MinGW-w64的编译器。
1 |
|
最后,开始编译:
1 |
|
防止踩坑!
不过,CMake的交叉编译设置有两个大坑。这两个坑直接影响最终的构建系统生成,而更要命的是,CMake还不会报错,你必须费九牛二虎之力才知道错在哪里!
大坑1: 配置工程时,构建目录必须为空
CMake的交叉编译工具链设置,只对初次生成的构建系统(即从空目录生成)生效。它无法给已有的构建系统指定工具链,即使指定也没用,还是再用原来的编译器。
比如说,你工程的build/
目录已经有了你之前生成的Ninja构建系统,本来编译成Linux应用。现在,你想从该目录编译出Windows应用,于是重新使用cmake
命令来生成构建系统,带上-DCMAKE_TOOLCHAIN_FILE
参数。实践证明,这是不行的,编译器依然是原有的Linux GCC。
唯一的解决办法是,要么删掉该目录,要么在新的目录重新生成一套构建系统。
大坑2: 务必设置CMAKE_SYSTEM_PROCESSOR
变量CMAKE_SYSTEM_PROCESSOR
存放本机处理器的架构,如果是交叉编译则存放目标机器处理器架构。
在本机编译的场合下,CMake会自动设置该变量的值,无需人工干预;但在交叉编译的情况下,CMake是不会自动设置的,它始终为空,即使你明确指定了编译器也是如此。
因此,在交叉编译工具链中,你最好手动指定CMAKE_SYSTEM_PROCESSOR
的值,例如例子中win32-cross-build.cmake
开头两行:
1 |
|
值得一提的是,有些开源项目会依赖CMAKE_SYSTEM_PROCESSOR
的值,比如DISTRHO Plugin Framework,它在生成VST3插件时,需要获得该值以便于建立存放插件的目录。但另一些项目则不会用上该变量。不过为保险起见,最好同时设置这两个变量。
总结
CMake的交叉编译体验是非常顺畅的。它能自动以设置好的编译器来构建项目,并且还能指定不同的构建路径,以便同时为多个平台进行构建。如果项目有跨平台交叉编译的需求,比如同时编译适用于Linux和Windows的版本,不妨参考。
- 本文作者: 爱拼安小匠
- 本文链接: https://anclark.github.io/2023/03/19/Programming_Tips/CMake_ 交叉编译的参数/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0(署名-非商用-禁止演绎 3.0) 许可协议。转载请注明出处!