gpt4 book ai didi

c++ - 除非明确覆盖,否则如何创建采用默认值的 CMake 变量?

转载 作者:行者123 更新时间:2023-11-30 04:55:13 29 4
gpt4 key购买 nike

我有一个使用 CMake 构建的 C++ 项目。我希望 CMakeLists.txt 中的构建配置能够构建在 Release 中默认模式,内置 Debug只有在明确指定时才使用模式。

引用thisthis , 为了允许从命令行指定构建类型,我将变量设置如下:

set(CMAKE_BUILD_TYPE Release CACHE STRING "")

但是,这会缓存上次构建的构建类型,所以如果最后一次构建是 Debug , 我需要明确指定 Release在下一个版本中。

我尝试使用 FORCE并尝试添加

unset(CMAKE_BUILD_TYPE CACHE)

set() 之前, 但是这两种方法都将值固定为 Release并覆盖用户指定的值。

有办法实现吗?谢谢。


下面是一个MCVE:

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
project(Test LANGUAGES CXX)

set(CMAKE_BUILD_TYPE Release CACHE STRING "")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DDEBUG")

file(GLOB SOURCES *.cpp)

add_executable(test ${SOURCES})

测试.cpp

#include <iostream>

int main() {
#ifdef DEBUG
std::cout << "Debug defined" << std::endl;
#else
std::cout << "Debug not defined" << std::endl;
#endif
return 0;
}

为了构建,我使用

cmake .
make

第一步可能有-DCMAKE_BUILD_TYPE=Debug对于 Debug模式。

最佳答案

你可以这样使用:

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()

这样,如果没有向 CMake 指定任何内容,它将使用您在此处设置的任何值,否则将使用提供的值。

为了防止它被用于所有后续构建,添加

unset(CMAKE_BUILD_TYPE CACHE)

接近脚本的末尾,以便它删除任何缓存值并依赖默认值或提供的值。

关于c++ - 除非明确覆盖,否则如何创建采用默认值的 CMake 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53159371/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com