Linux C ++ LD_LIBRARY_PATH抑制标准库

时间:2013-07-22 16:53:25

标签: c++ linux standard-library

我是C ++的新手,虽然我最近做了一些Objective C,所以有些看起来很模糊。

我正在编写一些测试程序,以判断某些事情是否可行。在我(非常简单的'Hello World')程序中,我使用cout输出一些文本,但是当我修改LD_LIBRARY_PATH指向第三方应用程序所需的某些库时,我将进行通信我没有输出,但没有来自g ++的编译器错误。

我尝试过包含标准路径,例如/usr/local/lib:/usr/lib:/lib但是当我在路径中包含它时,我仍然没有输出。

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello World";
    return 0;
}

正如你所看到的那样,在我设置LD_LIBRARY_PATH之前,它是一个非常简单的程序,可以正常工作。

我在任何阶段都没有任何错误,所以我无法知道它是否正在运行。有什么我可以检查或以任何方式测试程序是否正在运行?

P.S。我也尝试将输出写入一个在设置路径之前有效的文件。

非常感谢

更新

感谢您的回复(请参阅下面的评论结果)

基于@Nemo所说的第三方应用程序有自己的libstdc ++版本。所以,这是正确的,我已经用标准安装版本换出了他们的库版本。虽然我现在正在获取“Hello World”输出,但是当我对程序进行扫描时仍然会收到很多No such file or directory错误,所以我猜这个问题只是部分修复了。我不确定我所做的是“允许”还是如何从这里开始。

1 个答案:

答案 0 :(得分:0)

如果你跑:

ldd a.out

其中a.out是可执行文件的名称,它将打印该可执行文件的运行时共享库​​依赖项(请参阅http://linux.die.net/man/1/ldd

以下是输出示例:

linux-vdso.so.1 =>  (0x00007fff463ff000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f75f6979000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f75f65ba000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f75f62bd000)
/lib64/ld-linux-x86-64.so.2 (0x00007f75f6c85000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f75f60a7000)

现在,一旦你知道你的应用程序正在搜索什么,你必须知道它正在LD缓存(或动态链接器缓存)中搜索它。这通常存储在/etc/ld.so.cache中。但是,您不应手动编辑它。相反,您应该使用ldconfig重新生成该缓存。

您可以使用:

ldconfig -p

显示所有缓存条目。

运行时

ldconfig

(以root身份),您将重新生成ldcache。除非使用“-n”,否则将默认扫描'/ lib'和'/ usr / lib'目录以及文件'/etc/ld.so.conf'中列出的任何目录。可以在命令行上指定其他目录。

当调用可执行文件时,它还将检查ldd输出中列出的任何文件的LD_LIBRARY_PATH(除了ldcache之外)中的路径。

所以,你可以做的就是运行:

ls -lah

对于exectuable的ldd输出中列出的每个文件。如果缺少任何文件,则必须使用/ usr / lib或此类目录中的相应共享库(* .so)替换它们并重新生成ldcache。生成缓存后,它们应显示在ldconfig -p输出中。

如果要添加要包含在ldconfig ldcache生成中的新路径,可以将它们添加到/etc/ld.so.conf文件中。然后,下次生成ldcache时,它将在这些目录中搜索您的共享对象。您也可以将它们放在/ lib或/ usr / lib目录中。我建议不要这样做。相反,我建议使用/ usr / local / lib目录。它通常位于ldcache路径中,旨在与用户生成的共享库一起使用。

希望有所帮助

请参阅:http://linux.die.net/man/8/ldconfig

请参阅:http://linux.die.net/man/1/ldd

最后,“locate”命令对于查找任何路径中的文件非常有用。它使用经常更新的数据库,因此如果文件已存在一段时间,它可能位于locate数据库中。

您可以搜索如下文件:

locate libstdc++.so.6

如果文件最近已添加到路径中且不在locate数据库中,则可以运行updatedb来重新生成locate数据库。然后,您应该能够在文件系统上找到任何文件。

有关此主题的更多信息,我建议您阅读本书:http://www.network-theory.co.uk/docs/gccintro/