我是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
错误,所以我猜这个问题只是部分修复了。我不确定我所做的是“允许”还是如何从这里开始。
答案 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/