我可以让 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 的 Z7
、Zi
和 ZI
之间的差异?
我希望 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 的 Z7
、Zi
和 ZI
之间的差异?