C++ 编译库,以便GDB自动查找源

C++ 编译库,以便GDB自动查找源,c++,linux,cmake,gdb,C++,Linux,Cmake,Gdb,我们正在Linux下用CMAKE编译一个库,然后默认安装在/opt/mylib下,它的源代码也放在这个文件夹中 当用户尝试使用GDB进行调试时,GDB不会自动找到库源 我们如何在不指定任何内容的情况下编译GDB查找源代码的库? 例如C++标准库就是这样工作的。我可以调试应用程序,而不必告诉GDB在哪里可以找到源代码 注意:这个问题不是关于如何让GDB找到源代码(我知道如何做),而是如何调整CMakeLists.txt和编译过程,即不需要在GDB中手动指定源目录。您可能正在寻找-fdebug pr

我们正在Linux下用CMAKE编译一个库,然后默认安装在
/opt/mylib
下,它的源代码也放在这个文件夹中

当用户尝试使用GDB进行调试时,GDB不会自动找到库源

我们如何在不指定任何内容的情况下编译GDB查找源代码的库?

<>例如C++标准库就是这样工作的。我可以调试应用程序,而不必告诉GDB在哪里可以找到源代码


注意:这个问题不是关于如何让GDB找到源代码(我知道如何做),而是如何调整
CMakeLists.txt
和编译过程,即不需要在GDB中手动指定源目录。

您可能正在寻找
-fdebug prefix map=old=new
GCC标志

从:

编译驻留在旧目录中的文件时,记录调试信息,将其描述为文件驻留在新目录中。这可用于在调试信息中用安装时路径替换生成时路径。它还可以通过使用将绝对路径更改为相对路径。新的。这可以提供更多与位置无关的可复制构建,但可能需要一个额外的命令来告诉GDB在哪里可以找到源文件。另请参见-ffile前缀映射


如果希望调试编译后的二进制文件而不安装它们,“可能需要额外的命令”部分适用。调试已安装的二进制文件只会起作用(TM)。

我认为这是不可能的,但一个解决方案可能是在目标机器上定义一个名为
/path/to/my/sources
的符号链接,指向
/opt/mylib
我相信这是可能的,因为
rpmbuild
执行类似的技巧来创建debuginfo RPM,它不仅安装调试符号,还安装源代码,后者位于与生成二进制文件不同的位置。GDB以这种方式正确定位提供的源。我只是不知道
rpmbuild
是怎么做到的。在调查了一些之后,似乎
rpmbuild
附带了一个程序,
debugedit
,用于修改ELF调试信息。这是一个内部程序,没有安装在path中,与许多其他RPM组件不同,它是一个二进制文件,不是脚本。如果您想知道它是如何工作的,那么我确信源代码是可用的。@JohnBollinger:
debugedit
看起来是一个潜在的解决方案。多谢各位!