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

Can I make cmake always generate debugging symbols?

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

我知道我可以生成 RelWithDebInfo 构建,并在其中获取符号,但我也想要 Release 构建中的符号。我从不想要没有符号的构建。

我可以这样做吗?

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

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

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

只是为了扩展@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_options along with generator expressions 为每个目标应用标志:

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

从 CMake 3.2.2 开始,没有内置的 CMake 方法来指定 "turn on debug flags"。我不确定这是否会出现在卡片上,因为 CMake 只能抽象出这么多特定于平台的细节。

您可以为调试符号设置的标志不能真正等同于跨平台;例如如何以有意义的跨平台方式表达 MSVC 的 Z7ZiZI 之间的差异?