在/ usr / local / lib中使用共享库


58

我已经从源代码构建了一些库,之后的文件make install/usr/local/lib

例如,就我而言,我有libodb-2.2.so此目录中的文件。

但是,当我启动与链接的可执行文件时,libodb出现错误:加载共享库时出错:libodb-2.2.so: cannont open shared object file: No such file or directory.

这是否意味着我的可执行文件构建不正确?还是应该指示系统文件夹中/usr/local/lib也可能有一些有趣的库?

我正在使用Ubuntu 12.04,Linux内核3.2.0-38-generic。



我强烈建议您与调试器建立良好的友谊关系
DDS

@DDS我建议您详细说明。您知道这里是一个协作站点。请指出,例如gdb,无论如何都会有帮助的方法link。我真的很好奇。起初,我的观点与这个问题无关。但是我可能是错的。的确,我gdb对存储库的了解还不够。
Stephane Rolland

抱歉...这个注释应该放在关于C编程的学习者问题上的stackoverflow上...只是没有看到U&L
DDS

@DDS初学者是学习C编程还是学习Linux上的构建?请更精确。例如,我来自Windows。这并不意味着我不了解C ++……我倾向于认为您的判断行为不准确。即使是SO,您的行为也会很快引起主持人的注意。注意这一点。您正在一个合作者网站上,爱好者的程序员共享有用的知识。没有某个地方能使你的自我恭维。(不用担心,当我开始SO时,我也会被轻度/合理地打击,我认为那是一件非常好的事情)。
Stephane Rolland

Answers:


58

对于当前会话,您可以

导出LD_LIBRARY_PATH = / lib:/ usr / lib:/ usr / local / lib

或者使更改永久生效,您可以添加/usr/local/lib到该更改/etc/ld.so.conf(或其中包含的更改)并ldconfig以root身份运行。

如果仍然有问题,运行ldd [executable name]将向您显示它正在尝试查找的库,以及找不到的库。


3
man对页ldd(1)“在通常情况下,LDD调用标准的动态连接器(见ld.so(8))与LD_TRACE_LOADED_OBJECTS环境变量设置为1,这将导致链接器显示库的依赖。要知道,然而,在某些情况下,某些版本的ldd5月。试图通过直接执行程序。因此,你永远不应该使用以获得依赖信息ldd不信任的可执行文件,因为这可能导致执行任意代码更安全的替代与交易时不受信任的可执行文件是:...”
SlySven

4
“ ... $ objdump -p /path/to/program | grep NEEDED
SlySven '16

很好-我以前从未见过objdump。
2016年

按照文章这个答案是规范地不正确有害的。对于正确的方法,根据问题和解答,使用-L-rpath在编译期间设置库的链接搜索路径和运行时搜索路径是正确的方法。
悬崖阿姆斯特朗

36

如果您ldconfig在构建库后已经运行,请继续阅读。如果不是,首先阅读ldconfig

/usr/local/lib可能不在ldconfig使用的库路径中。您可以这样做:

ldconfig /usr/local/lib

并且应该将这些内容添加到链接器缓存中,但是正确添加路径可能更好。确保您有一个/etc/ld.so.conf.d目录。如果是这样,请添加文件(将其称为“ usr-local.conf”或其他名称),然后在其中添加一行:

/usr/local/lib

现在运行ldconfig。如果没有ld.so.conf.d目录,则应该有一个/etc/ld.so.conf 文件,您可以将该行添加到它的末尾。


3
我已经将custom.conf文件添加到/etc/ld.so.conf.dslded ldconfig中,以将其考虑在内,并且我的可执行文件现在可以启动。
Stephane Rolland
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.