我有一个使用CMake构建的C ++项目。我希望CMakeLists.txt中的构建配置应使其默认情况下以Release
模式进行构建,并且仅在明确指定时才以Debug
模式进行构建。
请参阅this和this,以允许从命令行指定构建类型,我将变量设置如下:
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})
test.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
模式。
答案 0 :(得分:1)
您可以使用以下内容:
function myTcpipCallback(obj,evt)
% Bufferize
obj.UserData=[obj.UserData ; fread(obj,1,'char')]; %Read 1 byte
% Check if the message if known
msg = obj.UserData;
if isComplete(msg) %
obj.UserData=[]; % empty buffer
processMessage(msg); % do something with message
end
end
这样,如果未为CMake指定任何内容,它将使用您在此处设置的任何值,否则使用提供的值。
要防止将其用于以后的所有构建,请添加
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
在脚本的结尾处,以便它删除所有缓存的值并依靠默认值或提供的值。