CMake编译选项CMAKE_CXX_FLAGS详解

概要

本文涉及cmakedebug/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

你可能感兴趣的:(c++,c++)