让gcc在调试信息中放置相对文件名

drd*_*man 14 debugging gcc cmake debug-symbols

我正在编译的项目使用CMake,它喜欢绝对的路径名.

当我在启用调试信息的情况下进行编译时,gcc会将这些长名称放入.debug_str部分,这对于调试是不利的.我希望在那里有一个简短的相对项目根路径名.

是否有一些选项可以告诉gcc在发出调试数据之前去除路径名的某些部分?或者,也许,有一些工具可以在已编译的二进制文件上执行此操作?

我已经尝试使用SET(CMAKE_USE_RELATIVE_PATHS ON)(这似乎是令人难以接受的开发者)的选项,但我使用的乱源生成,路径名仍未形式我想他们是.即他们./../src/mod_foo/foo.c而不是mod_foo/foo.c.

het*_*man 14

您可以使用-fdebug-prefix-map标志重新映射调试信息路径.例如,要使用相对于构建位置的路径,请使用:-fdebug-prefix-map =/full/build/path =.

  • 这应该是公认的答案。它比 sakra 的答案简单和脆弱得多。另外值得注意的是“-ffile-prefix-map”标志,因为“-fdebug-prefix-map”不会影响“__FILE__”宏等内容。 (3认同)

sak*_*kra 6

您可以设置CMake目标的RULE_LAUNCH_COMPILE属性,以使CMake调用shell脚本,该脚本在调用gcc之前将源文件路径转换为项目相对路径.使用CMake函数configure_file生成一个shell脚本,该脚本知道您的项目PROJECT_SOURCE_DIRPROJECT_BINARY_DIR项目.

在您的最外层CMakeLists.txt添加以下代码:

configure_file(
    "${PROJECT_SOURCE_DIR}/gcc_debug_fix.sh.in"
    "${PROJECT_BINARY_DIR}/gcc_debug_fix.sh"
    @ONLY)

add_executable (MyExecutable ...)

set_target_properties(MyExecutable PROPERTIES 
    RULE_LAUNCH_COMPILE "${PROJECT_BINARY_DIR}/gcc_debug_fix.sh")
Run Code Online (Sandbox Code Playgroud)

以下模板shell脚本gcc_debug_fix.sh.in需要转到CMake项目的根目录:

#!/bin/sh

PROJECT_BINARY_DIR="@PROJECT_BINARY_DIR@"
PROJECT_SOURCE_DIR="@PROJECT_SOURCE_DIR@"

# shell script invoked with the following arguments
# $(CXX) $(CXX_DEFINES) $(CXX_FLAGS) -o OBJECT_FILE -c SOURCE_FILE

# extract parameters
SOURCE_FILE="${@: -1:1}"
OBJECT_FILE="${@: -3:1}"
COMPILER_AND_FLAGS=${@:1:$#-4}

# make source file path relative to project source dir
SOURCE_FILE_RELATIVE="${SOURCE_FILE:${#PROJECT_SOURCE_DIR} + 1}"

# make object file path absolute
OBJECT_FILE_ABSOLUTE="$PROJECT_BINARY_DIR/$OBJECT_FILE"

cd "$PROJECT_SOURCE_DIR"

# invoke compiler
exec $COMPILER_AND_FLAGS -c "${SOURCE_FILE_RELATIVE}" -o "${OBJECT_FILE_ABSOLUTE}"
Run Code Online (Sandbox Code Playgroud)

shell脚本使用来自变量的信息PROJECT_BINARY_DIRPROJECT_SOURCE_DIR源文件的路径转换为相对于项目的根和目标文件的路径的路径为绝对路径.因为gcc现在传递了一个项目相对路径,所以也.debug_str应该使用该路径.

以下警告适用:

  • 一定要设置可执行位gcc_debug_fix.sh.in.
  • 要使脚本工作CMAKE_USE_RELATIVE_PATHS必须OFF再次设置.
  • 该脚本在命令行上假设文件路径的位置.如果CMake使用不同的规则来调用编译器,则这可能不起作用.更强大的解决方案是扫描-o-c标志的脚本参数.