在Visual Studio代码中定义DEBUG和RELEASE符号
Define DEBUG and RELEASE symbols in Visual Studio Code
在Ubuntu 18.04上使用Visual Studio代码1.39.2。我的C++程序有使用命令cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug ..
生成带有Cmake的Makefile的任务。有一个等效的Release
版本。
此后,运行make
任务,该任务在./PROJECT/build/Debug
或./PROJECT/build/Release
文件夹中正确构建调试和发布版本。
问题是Visual Studio代码不理解任何Debug
或_DEBUG
符号,因此以下代码无法按预期工作:
#ifdef _DEBUG // or #ifdef Debug
cout << "Debug buildn";
#else
cout << "Release buildn";
#endif
运行应用程序时,只打印Release build
,从不打印Debug build
。此外,在Visual Studio代码编辑器中,Debug build
行显示为灰色。
使用#define DEBUG
手动定义符号是一种选择,但每次更改构建类型时都需要手动编辑文件。
如何让Visual Studio代码根据所选的生成任务定义和理解正确的符号?或者有什么聪明的方法可以让Code"查看"生成的CMake/make文件(如CMakeCache.txt、CMake_install.CMake、Makefile(?
注意:此解决方案将解决编译过程中无法理解符号的问题。然而,Visual Studio编辑器不理解用于表示的_DEBUG
或NDEBUG
符号的问题仍然存在。
在对该问题的评论中,有人建议将该问题作为重复问题。有一些重叠,但这个问题涉及EclipseIDE并使用过时的CMake命令。但它确实提供了一些线索,在深入研究CMake文档后,通过对CMakeLists.txt
:的这些更改,可以解决问题
步骤1-如果需要,显式设置CMake构建类型
在CMakeLists.txt
顶部附近,添加以下内容:
if (CMAKE_BUILD_TYPE STREQUAL "")
# Build type is not set eg. command was "cmake .."
message(STATUS " Diag: Build type was unspecified, set to Release")
set(CMAKE_BUILD_TYPE Release)
else ()
message(STATUS " Diag: Build type specified as '${CMAKE_BUILD_TYPE}'")
endif ()
步骤2-定义"_DEBUG"和其他符号
在步骤1中的代码之后,添加以下内容:
if (${CMAKE_BUILD_TYPE} STREQUAL Debug)
set_directory_properties(PROPERTIES COMPILE_DEFINITIONS "_DEBUG")
else ()
set_directory_properties(PROPERTIES COMPILE_DEFINITIONS "NDEBUG")
endif ()
现在,从某个build
文件夹中使用以下三种方式之一调用CMake。这可以是从命令行,也可以是作为Visual Studio代码中的任务,然后make
最终的二进制文件:
- cmake
- cmake-G"Unix Makefiles"-DCMAKE_BUILD_TYPE=发布
发布二进制文件,Release build
显示
- cmake-G"Unix Makefiles"-DCMAKE_BUILD_TYPE=调试
调试二进制文件和Debug build
显示
您可以添加"-D _ DEBUG";在task.json文件中;args":当您添加此参数时,使用CTL+F5,您可以在调试模式下进行构建。
- ISearchJob->Release() 卡住
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- 调用 Napi::ThreadSafeFunction::Release() 会导致 ELIFECYCLE 322122
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 在 Boost::fiber 中引发的BOOST_ASSERT故障 Visual Studio "Debug" 构建
- LLVM 编译:目标的配方 '../lib/IR/Release+Asserts/Intrinsics.gen.tmp' failed
- 在Visual Studio代码中定义DEBUG和RELEASE符号
- Visual Studio 2017中使用ifstream时,Release和Debug的输出不同
- Qt在"debug"模式下正确渲染此SVG,但在"release"
- 从动态库中加载FORTRAN函数:Debug vs Release
- 在Release中获取std::bad_alloc,但在Debug中未获取
- 使用 CMAKE 如何停止"Debug"和"Release"子目录
- 我可以将OpenCV的Release配置与我的应用程序的Debug配置一起使用吗
- 预生成的解决方案不会在Release中编译,而是在Debug中编译
- Visual Studio Release 和 Debug 的区别
- 应用程序验证器DEBUG或RELEASE模式
- Boost Debug和Release库是相同的吗?
- 在RELEASE上有bug,在DEBUG上没有
- 在项目的DEBUG和RELEASE版本中,整数的按位操作的行为是不同的
- CMake Visual Studio Debug/Release find_package