如何使用cmake标志为Release版本生成pdb文件?

Eze*_*lez 10 cmake visual-studio pdb-files visual-studio-2012

我正在使用cmake生成可视化工作室解决方案.现在我想为Release版本生成pdb文件.(为什么?因为我希望有符号以防用户发现一些错误)

我尝试通过设置以下标志而不成功:

set(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE} CACHE STRING "Build Types" FORCE)

IF(WIN32)

set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/Release")
set( CMAKE_EXE_LINKER_FLAGS_RELEASE "/debug /INCREMENTAL")
set( CMAKE_SHARED_LINKER_FLAGS_RELEASE "/debug /INCREMENTAL")
set( CMAKE_MODULE_LINKER_FLAGS_RELEASE "/debug /INCREMENTAL")
set( CMAKE_CXX_FLAGS_RELEASE "/MD /Zi /O2 /Ob1 /D NDEBUG")
set( CMAKE_C_FLAGS_RELEASE "/MD /Zi /O2 /Ob1 /D NDEBUG")
ENDIF(WIN32)
Run Code Online (Sandbox Code Playgroud)

看起来Cmake忽略了这些集合:提前感谢您的帮助!

Phi*_*Lab 14

我用过旗帜

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi")
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF")
Run Code Online (Sandbox Code Playgroud)

该网站解释了详细信息

  • 解释详细信息的链接文章移至此处:https://www.wintellect.com/ Correctly-creating-native-c-release-build-pdbs/ (3认同)
  • `CMAKE_SHARED_LINKER_FLAGS_RELEASE`是一个全局缓存变量,所以我不得不添加`CACHE STRING""FORCE`.还要确保适当使用`CMAKE_STATIC_LINKER_FLAGS_RELEASE`和`CMAKE_EXE_LINKER_FLAGS_RELEASE`变量. (2认同)

And*_*sev 5

另一种方法是使用cmake生成器表达式(https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html),例如:

对于所有目标和所有配置:

add_compile_options("$<$<NOT:$<CONFIG:Debug>>:/Zi>")
add_link_options("$<$<NOT:$<CONFIG:Debug>>:/DEBUG>")
add_link_options("$<$<NOT:$<CONFIG:Debug>>:/OPT:REF>")
add_link_options("$<$<NOT:$<CONFIG:Debug>>:/OPT:ICF>")
Run Code Online (Sandbox Code Playgroud)

Release仅针对特定目标和配置:

target_compile_options(my_exe PRIVATE "$<$<CONFIG:Release>:/Zi>")
target_link_options(my_exe PRIVATE "$<$<CONFIG:Release>:/DEBUG>")
target_link_options(my_exe PRIVATE "$<$<CONFIG:Release>:/OPT:REF>")
target_link_options(my_exe PRIVATE "$<$<CONFIG:Release>:/OPT:ICF>")
Run Code Online (Sandbox Code Playgroud)