Cmake 如何省略单个源文件的调试信息?

Cmake 如何省略单个源文件的调试信息?,cmake,Cmake,我正在为解析调试信息的工具编写一个测试,我想在调试目标中省略单个编译单元源文件的调试信息。有没有办法用cmake实现这一点 显然,我可以对编译器标志进行硬编码,但我希望我的构建能够在不同的操作系统和工具链(如gnu和msvc)之间进行移植 动态更改CMAKE_BUILD_类型似乎不起作用。您可以访问CMAKE在每个配置中使用的默认编译标志,请参见答案。也可以在任何源文件上设置属性。因此,在您创建了一个目标之后,它应该像查询您的语言的默认编译选项一样简单,并使用应用适当的默认值 例如,下面是一个非

我正在为解析调试信息的工具编写一个测试,我想在调试目标中省略单个编译单元源文件的调试信息。有没有办法用cmake实现这一点

显然,我可以对编译器标志进行硬编码,但我希望我的构建能够在不同的操作系统和工具链(如gnu和msvc)之间进行移植


动态更改CMAKE_BUILD_类型似乎不起作用。

您可以访问CMAKE在每个配置中使用的默认编译标志,请参见答案。也可以在任何源文件上设置属性。因此,在您创建了一个目标之后,它应该像查询您的语言的默认编译选项一样简单,并使用应用适当的默认值

例如,下面是一个非常简单的项目的CMakeLists.txt:

cmake_minimum_required(VERSION 3.6.1)

project(MyProj)

set_source_files_properties(file1.cpp PROPERTIES COMPILE_FLAGS ${CMAKE_CXX_FLAGS_RELEASE})

get_source_file_property(FILE1_FLAGS file1.cpp COMPILE_FLAGS)
get_source_file_property(FILE2_FLAGS file2.cpp COMPILE_FLAGS)

message( "\${FILE1_FLAGS} = ${FILE1_FLAGS}")
message( "\${FILE2_FLAGS} = ${FILE2_FLAGS}")

add_executable( MyExe file1.cpp file2.cpp )
MSVC的哪些输出:

${FILE1_FLAGS} = /MD /O2 /Ob2 /DNDEBUG
${FILE2_FLAGS} = NOTFOUND
如果检查生成的MyExe.vcxproj,您将看到默认值用于编译file2.cpp,而对于file1.cpp,所有配置都使用发行版设置:

<ClCompile Include="C:\temp\cmake\file1.cpp">
  <InlineFunctionExpansion Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AnySuitable</InlineFunctionExpansion>
  <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MaxSpeed</Optimization>
  <RuntimeLibrary Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MultiThreadedDLL</RuntimeLibrary>
  <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  <InlineFunctionExpansion Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AnySuitable</InlineFunctionExpansion>
  <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
  <RuntimeLibrary Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MultiThreadedDLL</RuntimeLibrary>
  <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  <InlineFunctionExpansion Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">AnySuitable</InlineFunctionExpansion>
  <Optimization Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">MaxSpeed</Optimization>
  <RuntimeLibrary Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">MultiThreadedDLL</RuntimeLibrary>
  <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='MinSizeRel|Win32'">NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
  <InlineFunctionExpansion Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">AnySuitable</InlineFunctionExpansion>
  <Optimization Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">MaxSpeed</Optimization>
  <RuntimeLibrary Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">MultiThreadedDLL</RuntimeLibrary>
  <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='RelWithDebInfo|Win32'">NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="C:\temp\cmake\file2.cpp" />

我没有在其他生成器上尝试过这一点,但它的工作原理应该是相同的。

要做到这一点,您必须修改默认标志,因为对于多配置生成器,您不能强制使用特定的生成类型。这只是一个简单的示例,演示如何从默认值中删除调试标志,然后将其添加回默认值。然后可以更新此示例,使用一个变量来收集所有源文件和一些if语句,以检查使用哪个编译器来测试-g或/Zi


这似乎是在添加标志,而不是替换它们。不幸的是,有些标志没有否定形式,因此一旦添加,就无法关闭。请参阅我添加的示例和说明。这不起作用。该示例返回错误cl:命令行错误D8016:“/O2”和“/RTC1”命令行选项不兼容。这是因为发布标志只是添加到调试标志中${CMAKE_CXX_FLAGS_RELEASE}=/MD/O2/Ob2/DNDEBUG${CMAKE_CXX_FLAGS_DEBUG}=/MDd/Zi/Ob0/Od/RTC1您可以通过查看该文件的完整命令行来验证这一点。CMAKE_BUILD_类型仅适用于单个配置生成器。您可以从编译器的默认值中删除-g,假设可以使用的每个编译器都是-g,然后通过COMPILE_标志将其添加回其他每个源文件。
cmake_minimum_required(VERSION 3.12)

project(sample)

message( "\${CMAKE_CXX_FLAGS_RELEASE} = ${CMAKE_CXX_FLAGS_RELEASE}")
message( "\${CMAKE_CXX_FLAGS_DEBUG} = ${CMAKE_CXX_FLAGS_DEBUG}")
string(REPLACE "-g" "" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
string(REPLACE "/Zi" "" CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
string(REPLACE "-g" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
string(REPLACE "/Zi" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO ${CMAKE_CXX_FLAGS_RELWITHDEBINFO})
message( "\${CMAKE_CXX_FLAGS_DEBUG} = ${CMAKE_CXX_FLAGS_DEBUG}")
message( "\${CMAKE_CXX_FLAGS_RELWITHDEBINFO} = ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
set_source_files_properties(file1.cpp PROPERTIES COMPILE_FLAGS "/Zi")

add_executable( sample file1.cpp file2.cpp )