我可以让cmake总是生成调试符号吗?

Can I make cmake always generate debugging symbols?

本文关键字:调试 符号 cmake 我可以      更新时间:2023-10-16

我想让cmake在我的发布版本中生成符号。

我知道我可以生成RelWithDebInfo构建,并在那些中获得符号,但我也想在发布构建中获得符号。我从来不想要一个没有符号的建筑。

我可以这样做吗?

只是为了扩展@ doctor的正确答案,您有几个选择。或者全局设置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和生成器表达式来应用每个目标的标志:

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

从CMake 3.2.2开始,没有内置的CMake方法来指定"打开调试标志"。我不确定这是否会成为可能,因为CMake可以抽象的平台特定细节只有这么多。

你可以为调试符号设置的标志在不同的平台上是不一样的;例如,MSVC的Z7, ZiZI之间的差异如何以有意义的跨平台方式表达?

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

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

对于其他应该相似的编译器,除了包含可以不同的调试信息符号的开关。