cmake 指定编译类型

2021-06-09  本文已影响0人  book_02

cmake 生成的vs工程,默认是Debug的编译类型,如下图所示:


有时候想要在 camke 中指定编译类型,不用每次都打开工程来手动调。

1. 常规设置

1.1 CMakeLists.txt 中指定

通过设置变量 CMAKE_BUILD_TYPE 来实现

cmake_minimum_required(VERSION 3.0)

project(HelloWorld)

set(CMAKE_BUILD_TYPE Release)
message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")

add_executable(HelloWorld main.cpp)

1.2 注意事项

  1. 设置CMAKE_BUILD_TYPE要在添加target之前进行

1.3 运行cmake时指定

cmake ../source_dir -DCMAKE_BUILD_TYPE=Release

1.4 建议使用

为了防止 CMakeLists.txt 中覆盖 cmake 运行时的指定,建议在 CMakeLists.txt 如下使用:

if("${CMAKE_BUILD_TYPE}" STREQUAL "")
    set(CMAKE_BUILD_TYPE "Release")
endif()

完整如下:

cmake_minimum_required(VERSION 3.0)

project(HelloWorld)

if("${CMAKE_BUILD_TYPE}" STREQUAL "")
    set(CMAKE_BUILD_TYPE "Release")
endif()
message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")

add_executable(HelloWorld main.cpp)

1.5 编译类型

  1. Debug
  2. Release
  3. RelWithDebInfo
  4. MinSizeRel

2. 针对 vs 的方案

上面的修改并不能改变vs的配置,修改vs配置要设置 CMAKE_CONFIGURATION_TYPES 变量。

核心语句如下:

if("${CMAKE_BUILD_TYPE}" STREQUAL "")
    set(CMAKE_BUILD_TYPE "Release")
endif()
SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "" FORCE)

完整如下:

cmake_minimum_required(VERSION 3.0) 
project(HelloWorld)

if("${CMAKE_BUILD_TYPE}" STREQUAL "")
    set(CMAKE_BUILD_TYPE "Release")
endif()
message(STATUS "CMAKE_BUILD_TYPE : ${CMAKE_BUILD_TYPE}")
SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "" FORCE)

add_executable(HelloWorld main.cpp) 

打开后效果如下:


上面配置有个缺点,就是配置中只有 "Release"了,如果还需要其他,可以修改如下,加了个 "RelWithDebInfo"的类型,如果还要加类型,则在后面添加:

if("${CMAKE_BUILD_TYPE}" STREQUAL "")
    set(CMAKE_BUILD_TYPE "Release" "RelWithDebInfo")
endif()
SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "" FORCE)

后尝试发现把
SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "" FORCE)
替换成SET(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE}) 也是可行的

3. 不打开vs直接生成程序

如果只是要生成Release版的程序,不需要打开vs工程,可用如下命令去生成程序:

cmake -G "Visual Studio 14 Win64" .. 
cmake --build . --target ALL_BUILD --config Release

执行完之后,便会在Release文件夹下生成Release版本的程序

上一篇下一篇

猜你喜欢

热点阅读