2013-07-26 67 views
24

我建立使用一种称为ohNet框架的应用程序。 构建框架后,可以通过make install安装框架。默认情况下,库安装在/usr/local/[lib|include]文件夹内。好。库在/ usr/local/lib目录未找到

我使用Eclipse进行开发。为了使用这个库我必须设置包含路径库(在这种情况下usr/local/include/ohNet),设置链接的搜索路径(-L)(/usr/local/lib/ohNet)和特定的库(-l)(在这种情况下,我选择库所谓libohNet.so是此文件夹中 当我在Eclipse中构建它工作正常的项目,但如果我尝试运行我面对以下消息PROGRAMM:

error while loading shared libraries: libohNet.so: cannot open shared object file: No such file or directory 

我仔细检查过这一点,并且文件libohNet.so在该目录下! 那是什么这个文件无法找到原因?

我搜索谷歌和发现了一些帖子,说是有问题的,图书馆越来越安装到/usr/local/lib,而不是/usr/libsee here ...... 我一定要在eclipse配置一些额外的设置,使ld认识图书馆在这条道路?这有什么解决方案?

关于

+0

将'-L/usr/local/lib'添加到链接器行。 –

+0

我已经设置链接器的搜索路径为'/ usr/local/lib/ohNet' – Moonlit

+0

然后你需要检查你是否可以真正读取文件,并且它是.so文件的正确类型 - 例如,混合32和64位? –

回答

43

这是一个运行时错误,而不是构建错误。设置-L标志对运行时链接程序没有任何作用。你需要做的是告诉运行时加载器在/ usr/local/lib中查找库。你可以用两种方法来做到这一点。第一种是向路径添加到LD_LIBRARY_PATH环境变量:

 
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib" 

第二个是更新运行时链接的配置文件。发生这种情况无论是在文件/etc/ld.so.conf,通过将线:

 
/usr/local/lib 

某处在该文件中,或者在/etc/ld.so创建一个新的* .conf文件.conf.d /包含新路径的目录。例如:

 
/etc/ld.so.conf.d/99local.conf 

只:

 
/usr/local/lib 

。这是这样做的推荐方式,因为它允许您将自定义库路径与系统设置的路径分开。 (“99”前缀用于确保文件最后加载与其他文件相比较,因此它不会抢占可能包含相同库的系统路径。)

修改/创建文件后在/ etc中,您需要运行:

 
ldconfig 

作为更改生效的根。 (该命令更新的文件/etc/ld.so.cache,这是由运行时链接使用的实际文件。)

还有另一种方式为二进制找到所需的库在运行时。您实际上可以将库路径硬编码到可执行文件本身。这是通过设置所谓的“rpath”来完成的。这是一个链接器选项,必须从gcc(或g ++)传递给链接器,因此必须使用-Wl选项。链接器选项是-rpath=PATH。所以你需要把它添加到你的链接标志:

 
-Wl,-rpath=/usr/local/lib 

我不推荐这个你的情况。当您将库与可执行文件(可能包含安装程序)一起运输时,rpath非常有用,然后使用相对路径(使用rpath $ORIGIN功能)或绝对路径(例如,当您安装在/ opt中时)用于在运行时查找捆绑的库。

+0

谢谢你的确切答案。如果我的库位于/ usr/local/lib的子文件夹中(例如/ usr/local/lib/ohNet),则必须将每个路径添加到子文件夹。有没有办法告诉运行时加载器以递归方式在/ usr/loal/lib中搜索? – Moonlit

+0

@ user1291235您必须在其自己的行中分别添加每个单独的路径。 –

+1

@ user1291235我忘了提及rpath链接选项。我不建议你这样做,但很高兴知道,所以我已经将它添加到答案中。 –