我有 libstdc++ 和 libc 等的调试版本,并且想链接到它们。它们位于 /usr/lib/debug 中,而不是 /usr/lib 中。有什么想法吗?
我认为接受的答案具有误导性,因为
/usr/lib/debug
中的库不是/lib
、/usr/lib
中库的调试编译(-g -O0 ...)版本,而只是从相应库中剥离的调试符号在/lib
,/usr/lib
。请参阅 How to use debug version of libc 和 How to link against debug versions of libc and libstdc++ in GCC? 更多详细信息的已接受答案的解释。
引用:
中的图书馆不是真正的图书馆。相反,仅包含调试信息,但不包含真实 libc.so.6/usr/lib/debug
的.text
和.data
部分
和
在许多 Linux 安装中,调试库不包含真实代码;它们仅包含调试信息。两者是分开的,这样如果您不需要它们并且磁盘空间不足,您可以选择不安装它们,但调试库本身并没有什么好处。
检查自己:
objdump -h /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.19.so | grep -C1 text
11 .text 001488a3 000000000001f520 000000000001f520 000002b4 2**4
ALLOC, READONLY, CODE
.text
段是 ALLOC
但没有 CONTENTS
。与/lib/x86_64-linux-gnu/libc-2.19.so
中对应的库对比:
$ objdump -h /lib/x86_64-linux-gnu/libc-2.19.so | grep -C1 text
11 .text 001488a3 000000000001f520 000000000001f520 0001f520 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
假设Linux,
-L/usr/lib/debug
添加到链接器命令行。 gcc
/ld
将在默认系统目录之前查找。使用 ldd
命令验证是否链接了正确的库版本(仅限共享库)。LD_LIBRARY_PATH=/usr/lib/debug
。即使没有第 1 步,只要有一个库版本,您的应用程序就会从那里获取库,如果您使用发行版的包管理器进行安装,则很可能会发生这种情况。不过,两者都做是个好主意,因为某些库可能仅采用静态形式。
使用链接器标志。 ld/gcc
-L<LIBRARY_PATH>
仅对链接时间很重要,无论共享还是静态,如果链接器找不到它,则无法链接到库。
对于共享库环境变量
LD_LIBRARY_PATH
对于启动时间很重要。当您启动应用程序时,动态库加载器 ld.so 和 ld-linux.so 将在那里查找。