我正在使用cmake生成visual studio解决方案。现在我想为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)
看起来Cmake忽略了这些集合: 提前感谢您的帮助!
答案 0 :(得分:12)
我使用了旗帜
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")
This site解释详情
答案 1 :(得分:0)
在“现代Cmake”中,您可以为每个目标设置此方法,这是一种方法:
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC" AND CMAKE_BUILD_TYPE MATCHES "Release")
target_compile_options(${TARGET_NAME} PRIVATE /Zi)
# Tell linker to include symbol data
set_target_properties(${TARGET_NAME} PROPERTIES
LINK_FLAGS "/INCREMENTAL:NO /DEBUG /OPT:REF /OPT:ICF"
)
# Set file name & location
set_target_properties(${TARGET_NAME} PROPERTIES
COMPILE_PDB_NAME ${TARGET_NAME}
COMPILE_PDB_OUTPUT_DIR ${CMAKE_BINARY_DIR}
)
endif()
这些标志是特定于MSVC
而非WIN32
的。
答案 2 :(得分:0)
另一种实现方法是使用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>")
仅针对特定目标和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>")