3

我对 C++ 有点陌生,虽然我最近做了一些 Objective C,所以其中一些看起来有点熟悉。

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

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

#include <iostream>

using namespace std;

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

正如您所看到的,目前它是一个非常简单的程序,在我设置LD_LIBRARY_PATH.

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

PS我也试过在设置路径之前将输出写入一个可以工作的文件。

非常感谢

更新

感谢您的回复(结果见下方评论)

根据@Nemo 所说的关于 3rd 方应用程序拥有自己的 libstdc++.so 版本的说法,这是正确的,我已经用标准安装版本替换了他们的那个库版本。虽然我现在得到了“Hello World”输出No such file or directory,但在对程序进行 strace 时仍然收到许多错误,所以我猜这个问题只是部分解决了。我不确定我所做的是否“允许”或如何从这里开始。

4

1 回答 1

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。'/lib' 和 '/usr/lib' 目录,以及在文件 '/etc/ld.so.conf' 中列出的任何目录都会被默认扫描,除非使用了 `-n'。可以在命令行上指定其他目录。

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

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

ls -lah

在您的可执行文件的 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 libstdc++.so.6

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

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

于 2013-07-23T22:07:49.723 回答