概要
本文涉及cmake在debug/release模式下的编译选项控制,其具体的实践是基于submodule的代码组织形式。
基础知识
先看一下和CMAKE_CXX_FLAGS相关的参数默认值
参数 | 默认值 |
CMAKE_CXX_FLAGS | 无 |
CMAKE_C_FLAGS_DEBUG | -g |
CMAKE_CXX_FLAGS_RELEASE | -O3 -DNDEBUG |
如果对应参数未设置,则使用默认值。
我们在使用cmake命令时会指定使用哪种编译模式,它是通过CMAKE_BUILD_TYPE来定义的,如我们可以这么干:
Debug编译:
cmake -DCMAKE_BUILD_TYPE=Debug ..
Release编译:
cmake -DCMAKE_BUILD_TYPE=Release ..
对于debug模式,实际使用的编译选项是
CMAKE_CXX_FLAGS + CMAKE_C_FLAGS_DEBUG
对于release模式,实际使用的编译选项是
CMAKE_CXX_FLAGS + CMAKE_CXX_FLAGS_RELEASE
代码
假设我们有个工程,代码组织如下
├── CMakeLists.txt
├── sub_map
│ ├── CMakeLists.txt
│ ├── interface.h
│ ├── map.cpp
│ └── map.h
├── sub_reloc
│ ├── CMakeLists.txt
│ ├── interface.h
│ ├── reloc.cpp
│ └── reloc.h
└── wrapper.cpp
除了主工程,它还包含两个子模块(submodule),每个子模块有自己的cmakelist。假设我们使用debug模式进行编译,cmake文件中的CMAKE_CXX_FLAGS参数与实际使用的编译选项如下表所示(sub_reloc模块继承了主模块的参数):
模块 | CMAKE_CXX_FLAGS设置 | 实际使用的编译选项 |
wrapper | -std=c++11 -DANDROID | -std=c++11 -DANDROID -g |
sub_map | -std=c++17 | -std=c++17 -g |
sub_reloc | -std=c++14 ${CMAKE_CXX_FLAGS} | -std=c++14 -std=c++11 -DANDROID -g |
编译选项打印
默认的编译打印不会有实际使用的编译选项,如需要确认,需要这么做。
在cmakelist文件中添加(子模块也需要)
set(CMAKE_VERBOSE_MAKEFILE ON)
在make命令时需要添加
make VERBOSE=1