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 =.
您可以设置CMake目标的RULE_LAUNCH_COMPILE属性,以使CMake调用shell脚本,该脚本在调用gcc之前将源文件路径转换为项目相对路径.使用CMake函数configure_file生成一个shell脚本,该脚本知道您的项目PROJECT_SOURCE_DIR
和PROJECT_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_DIR
和PROJECT_SOURCE_DIR
源文件的路径转换为相对于项目的根和目标文件的路径的路径为绝对路径.因为gcc现在传递了一个项目相对路径,所以也.debug_str
应该使用该路径.
以下警告适用:
gcc_debug_fix.sh.in
.CMAKE_USE_RELATIVE_PATHS
必须OFF
再次设置.-o
和-c
标志的脚本参数. 归档时间: |
|
查看次数: |
6009 次 |
最近记录: |