cmake
编译器
CMake 选择编译器的优先级是:
1️⃣ -DCMAKE_C_COMPILER
2️⃣ CC / CXX 环境变量
3️⃣ PATH 搜索
4️⃣ fallback 到 /usr/bin/cc
你的系统里存在:
/usr/bin/cc -> gcc 4.8.5
/usr/bin/c++ -> g++ 4.8.5
所以 CMake 直接用了:
/usr/bin/cc
/usr/bin/c++
而 没有使用PATH 里的 /usr/local/bin/gcc,执行which gcc是:
/usr/local/bin/gcc
CMake 仍然可能选 /usr/bin/cc。
如果要使用 /usr/local/bin/gcc,cmake时直接指定gcc目录(升级gcc后,一般不卸载默认的/usr/bin/gcc )
-cmake "$@" ..
+cmake -DCMAKE_C_COMPILER=/usr/local/bin/gcc -DCMAKE_CXX_COMPILER=/usr/local/bin/g++ "$@" ..
编译选项
CMAKE_C_FLAGS =
CMAKE_C_FLAGS_DEBUG = -g
CMAKE_C_FLAGS_MINSIZEREL = -Os -DNDEBUG
CMAKE_C_FLAGS_RELEASE = -O3 -DNDEBUG
CMAKE_C_FLAGS_RELWITHDEBINFO = -O2 -g -DNDEBUG
CMAKE_CXX_FLAGS =
CMAKE_CXX_FLAGS_DEBUG = -g
CMAKE_CXX_FLAGS_MINSIZEREL = -Os -DNDEBUG
CMAKE_CXX_FLAGS_RELEASE = -O3 -DNDEBUG
CMAKE_CXX_FLAGS_RELWITHDEBINFO = -O2 -g -DNDEBUG
对于C语言设置CMAKE_C_FLAGS相关参数,C++语言设置CMAKE_CXX_FLAGS相关参数。并且分为DEBUG,RELEASE,MINSIZEREL和RELWITHDEBINFO四种类型。上面是默认值。
当CMake在编译项目的时候,可以同时设置CMAKE_CXX_FLAGS_DEBUG和CMAKE_CXX_FLAGS_RELEASE,如下:
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11 -Wl,-rpath=../lib")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11 -g")
上面的设置两个都有-std=c++11,这个选项是一个公共的选项,不管是Release还是Debug都需要设置。这种情况还可以把公共的设置放在CMAKE_CXX_FLAGS变量里面,如下:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wl,-rpath=../lib")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -g")
最终编译的时候的编译选项不管是Release还是Debug都包含了CMAKE_CXX_FLAGS这个变量。
如果设置环境变量DCMAKE_BUILD_TYPE=Debug,则会采用CMAKE_CXX_FLAGS_DEBUG方式编译。
打印编译命令
可通过以下几个方式,输出完整编译命令
- 执行命令cmake时追加:-DCMAKE_VERBOSE_MAKEFILE=ON
- 在CMakeLists.txt中添加:set(CMAKE_VERBOSE_MAKEFILEON ON)
- make时追加: VERBOSE=1
@ 表示目标的集合
编译选项

公共的选项可以放到CMAKE_CXX_FLAGS

具体使用时设置
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo "$@" ..
cmake -DCMAKE_BUILD_TYPE=Debug "$@" ..

浙公网安备 33010602011771号