本文介绍了使gcc将相对文件名放在调试信息中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时删除!!

我正在编译的项目使用CMake,。

The project I'm compiling uses CMake, which loves absolute pathnames.

当我使用调试信息进行编译时,gcc将这些长名称放入 .debug_str 部分,这对于调试是不好的。我想要有一个相对于项目的根路径名,而不是。

When I compile with debugging information enabled, gcc puts those long names into .debug_str sections, which is bad for debugging. I'd like to have short relative-to-project-root pathnames there instead.

有没有一些选项可以让gcc在发布调试数据之前删除一部分路径名?或者,也许有一些工具可以在编译的二进制文件上执行此操作?

Is there some option to tell gcc to strip some part of pathname before emitting debug data? Or, maybe, there is some tool that could do that on compiled binaries?

我尝试使用 SET(CMAKE_USE_RELATIVE_PATHS ON)(似乎是 by devs)选项,但是当我使用out-of-source builds时,路径名仍然不是我想要的形式。即他们是 ./../ src / mod_foo / foo.c 而不是 mod_foo / foo.c 。 / p>

I've tried using SET(CMAKE_USE_RELATIVE_PATHS ON) (which seems to be frowned upon by devs) option, but as I'm using out-of-source builds, pathnames are still not in the form I'd want them to be. I.e. they're ./../src/mod_foo/foo.c instead of mod_foo/foo.c.

推荐答案

您可以设置属性让CMake调用一个shell脚本,在调用gcc之前将源文件路径转换为项目相对路径。使用CMake功能生成了解您项目的 PROJECT_SOURCE_DIR PROJECT_BINARY_DIR 的shell脚本。

You can set the RULE_LAUNCH_COMPILE property of a CMake target to have CMake invoke a shell script which transforms the source file path to a project relative path before invoking gcc. Use the CMake function configure_file to generate a shell script which knows about the PROJECT_SOURCE_DIR and PROJECT_BINARY_DIR of your project.

在最外面的 CMakeLists.txt 中添加以下代码:

In your outermost CMakeLists.txt add the following code:

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")

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

The following template shell script gcc_debug_fix.sh.in needs to go to the root directory of the CMake project:

#!/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}"

shell脚本使用变量 PROJECT_BINARY_DIR PROJECT_SOURCE_DIR 将源文件的路径转换为相对于项目根路径和目标文件的路径一个绝对的路径。因为gcc现在已通过项目相对路径,所以 .debug_str 也应该使用该路径。

The shell script uses the information from the variables PROJECT_BINARY_DIR and PROJECT_SOURCE_DIR to transform the path of the source file to a path relative to the project root and the object file's path to an absolute path. Because gcc gets passed a project relative path now, .debug_str should use that path, too.

以下注意事项适用:


  • 确保设置可执行位 gcc_debug_fix.sh.in

  • 要使脚本正常工作 CMAKE_USE_RELATIVE_PATHS 再次设置为 OFF

  • 脚本对命令行上文件路径的位置进行假设。如果CMake使用不同的规则来调用编译器,这可能无效。一个更强大的解决方案是扫描 -o -c 标志的脚本参数。

  • Be sure to set the executable bit of gcc_debug_fix.sh.in.
  • For the script to work CMAKE_USE_RELATIVE_PATHS has to set to OFF again.
  • The script makes assumptions about the location of the file paths on the command line. This may not work if CMake uses a different rule to invoke the compiler. A more robust solution would be to scan the script arguments for the -o and -c flags.

这篇关于使gcc将相对文件名放在调试信息中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

1403页,肝出来的..

09-07 03:13