【问题标题】:How to omit debug info for a single source file?如何省略单个源文件的调试信息?
【发布时间】:2018-12-22 05:43:23
【问题描述】:

我正在为解析调试信息的工具编写测试,我想在我的调试目标中省略单个编译单元(源文件)的调试信息。有没有办法用cmake来完成这个?

显然,我可以对编译器标志进行硬编码,但我想让我的构建在不同的操作系统和工具链(比如 gnu 和 msvc)之间保持可移植性。

即时更改CMAKE_BUILD_TYPE 似乎不起作用。

【问题讨论】:

  • CMAKE_BUILD_TYPE 仅适用于单个配置生成器。您可以从默认值中删除 -g(对于编译器,假设每个可以使用的编译器都是 -g),然后通过 COMPILE_FLAGS 将其添加回每个其他源文件。

标签: cmake


【解决方案1】:

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

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 )

【讨论】:

    【解决方案2】:

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

    例如,这是一个非常简单的项目的 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" />
    

    我没有在其他生成器上尝试过这个,但它应该可以工作。

    【讨论】:

    • 这似乎是添加标志,而不是替换它们。不幸的是,有些标志没有“否定形式”,因此一旦添加,它们就无法关闭。
    • 查看我添加的示例和解释。
    • 这不起作用。该示例原样返回错误cl : Command line error D8016: '/O2' and '/RTC1' command-line options are incompatible。发生这种情况是因为发布标志被简单地添加到调试标志中。 ${CMAKE_CXX_FLAGS_RELEASE} = /MD /O2 /Ob2 /DNDEBUG ${CMAKE_CXX_FLAGS_DEBUG} = /MDd /Zi /Ob0 /Od /RTC1 您可以通过查看该文件的完整命令行来验证这一点。
    猜你喜欢
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2012-07-19
    • 2013-05-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多