Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何链接libc和libstdc的调试版本++;在海湾合作委员会?_C++_C_Debugging_Gcc - Fatal编程技术网

C++ 如何链接libc和libstdc的调试版本++;在海湾合作委员会?

C++ 如何链接libc和libstdc的调试版本++;在海湾合作委员会?,c++,c,debugging,gcc,C++,C,Debugging,Gcc,我知道,但它似乎对我不起作用 对于安装程序,采用一个简单的C++程序, HW.CPP ,由: INTIN(){{} /Calp> 在Linux上使用g++-o hw hw.cpp-O0-g编译时,运行ldd./hw给出: linux-gate.so.1 => (0x003e5000) libstdc++.so.6 => /usr/local/lib/libstdc++.so.6 (0x007c5000) libm.so.6 => /lib/tls/i6

我知道,但它似乎对我不起作用

对于安装程序,采用一个简单的C++程序, HW.CPP ,由: INTIN(){{} /Calp>

在Linux上使用
g++-o hw hw.cpp-O0-g
编译时,运行
ldd./hw
给出:

    linux-gate.so.1 =>  (0x003e5000)
    libstdc++.so.6 => /usr/local/lib/libstdc++.so.6 (0x007c5000)
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x006a4000)
    libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0x00a40000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a93000)
    /lib/ld-linux.so.2 (0x00a0f000)
现在我在
/usr/lib/debug/lib/tls/i686/cmov/
中似乎也有调试库,我认为这些库是系统库的相应调试构建

< > >强>问题>:/>强,我如何编译程序,使其与标准C和/或C++库的调试版本相关联,<代码> LBC/<代码> LBM< /COD>/<代码> LBSTDC++<代码>,共享或静态?对于共享构建,我希望
ldd./hw
的输出指向调试目录

(背景:我的项目使用的一个共享库被Valgrind报告为泄漏(“仍然可以访问”),但其来源不是共享库本身,而是dlopen类型代码()。因此,我认为如果我能够在CRT中单步执行
\u Start()
调用,我可能能够追踪罪魁祸首。)

更新/更正:我觉得我非常非常愚蠢-调试库可能一直都是按需要链接的。我被调试程序在单步执行时没有显示任何内容弄糊涂了,这是因为我没有库的源代码


更新II:好,确保上一次更新。我现在有了库源代码,但尽管标准库附带了调试符号,但我似乎没有单独的调试构建。这样的构建是否可用,我将如何与之链接?

您的程序将链接到调试库

只有“ldd./hw”在标准位置查找libstdc++。
为此,您需要更改LD_LIBRARY_路径以加载调试共享库,并更改ldd以正确查找它们。

在许多Linux安装中,调试库不包含真正的代码;它们只包含调试信息。这两者是分开的,因此如果不需要它们并且磁盘空间不足,您可以选择不安装它们,但是调试库本身并不好

GDB通常预配置为在需要时查找调试库


当然,你的系统可能不同。您不知道它是什么。

您可能知道一些标准库实现使用池进行快速分配@霍克:我很高兴接受这不是一个真正的担忧。让我烦恼的是,第三方代码可能会在我的代码中引起我无法抑制的警告(请注意,只有对一些我实际上没有的伪
.c
文件的引用,而不是对共享库的引用)。。。至少在调试CRT时,我希望能看得更清楚。这对我来说也不起作用。我尝试了几种设置该变量的方法,但是
ldd
没有改变。我知道设置
LD_LIBRARY_PATH
确实可以这样工作,因为它可以很好地与其他(非系统)库一起工作。。。或者你是说
ldd
永远不会报告调试库?@KerrekSB:你试过(假设bash):
ldu库路径=/usr/lib/debug/lib/tls/i686/cmov/ldd./hw
你说得对-我一直都在链接调试库。我被一件最愚蠢的事情吓坏了,那就是我没有标准的库源代码——因此调试器正在逐步执行,但无法显示任何内容!事实上,这毕竟没有帮助-我不只是想要调试符号,而是库的实际调试构建。这在Debian/Ubuntu上可用吗?通常不可用。如果您想逐步完成库代码,那么正常的优化库是一个问题,这是绝对正确的。当然,如果它只是您想要的特定库,那么您可以自己重新构建它
sudo-apt-get-build-dep-package-name
将安装进行构建所需的任何东西,并且源程序包本身可以使用
apt-get-source-package-name
下载。我可以获得源代码,就像
eglibc-source
一样,但是我如何与之链接,以避免意外使用标准库?使用
-nostlib
?假设您使用的是动态库,您可能根本不需要重新链接。只需执行
export LD_PRELOAD=/path/to/debug/libc.so.6
,然后从该shell运行的任何程序都将使用调试库。