我可以让cmake始终生成调试符号吗?

时间:2015-05-29 23:48:29

标签: c++ cmake symbols debug-symbols

我希望cmake在我的发布版本中生成符号。

我知道我可以生成RelWithDebInfo构建,并在那些中获取符号,但我也想在Release版本中使用符号。我从不想要一个没有符号的构建。

我可以这样做吗?

2 个答案:

答案 0 :(得分:10)

为了扩展@ doqtor的正确答案,你有几个选择。将全局CMAKE_CXX_FLAGS设置为将这些标志应用于所有构建类型:

if(MSVC)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zi")
else()
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
endif()

或者对于更细粒度的控制,使用target_compile_optionsgenerator expressions来应用每个目标的标记:

target_compile_options(example_target PRIVATE
    $<$<CXX_COMPILER_ID:MSVC>:/Zi>
    $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-g>
    )

从CMake 3.2.2开始,没有内置的CMake方式来指定&#34;打开调试标志&#34;。我不确定这是否会出现在卡片上,因为CMake只能抽象出很多特定于平台的细节。

您可以为调试符号设置的标志在整个平台上实际上是等同的;例如如何以有意义的跨平台方式表达MSVC与Z7ZiZI之间的差异?

答案 1 :(得分:3)

你想要实现的目标是没有意义的,因为你最终会有两个基本相同的目标,但无论如何......你可以通过这种方式将额外的标志传递给编译器(你不说哪个编译器你使用所以我将假设它是gcc):

SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")

对于除了交换机之外应该类似的其他编译器,以包含可能不同的调试信息符号。