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 "$@" ..

posted @ 2024-07-16 14:13  LdreamerD  阅读(63)  评论(0)    收藏  举报