问题描述
我正在编译的项目使用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)
(这似乎是属性使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}"
使用变量 PROJECT_BINARY_DIR
和 PROJECT_SOURCE_DIR
的信息将源文件的路径转换为相对于项目的路径root和目标文件的路径到绝对路径。因为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 toOFF
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将相对文件名放在调试信息中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!