Libraries in /usr/local/lib not found(未找到/usr/local/lib 中的库)
问题描述
我正在使用名为 ohNet 的框架构建应用程序.构建框架后,可以通过 make install
安装框架.默认情况下,这些库安装在 /usr/local/[lib|include]
文件夹中.好的.
我正在使用 Eclipse 进行开发.为了使用这个库,我必须设置库的包含路径(在本例中为 usr/local/include/ohNet
),设置链接器搜索路径 (-L)(/usr/local/lib/ohNet
) 和特定的库 (-l).当我在 Eclipse 中构建项目时,它工作正常,但是如果我尝试运行该程序,我将面临以下消息:
不过,我不建议您这样做.当您将库与可执行文件(可能带有安装程序)以及相对 rpath(使用 rpath $ORIGIN
功能)或绝对路径(当您安装在/opt,例如)然后用于在运行时查找那些捆绑的库.
I am building an application using a framework called ohNet.
After building the framework, there is the possibility to install the framework via make install
. By default the libraries are installed inside the /usr/local/[lib|include]
folders. ok.
I am using eclipse for development. In order to use this libraries I have to set the include path to the library (in this case usr/local/include/ohNet
), set the Linker search path (-L)(/usr/local/lib/ohNet
) and specific libraries (-l) (in this case i choose a library called libohNet.so
which is in this folder.
When I build the project in eclipse it works fine, however if i try to run the programm i am faced with the following message:
I've double checked this, and the file libohNet.so
is in this directory!
What's the reason that this file cannot be found?
I searched on google and found some posts, saying that it is problematic that libraries are getting installed into /usr/local/lib
instead of /usr/lib
see here ...
Do I have to configure some additional settings in eclipse
to make ld
recognize libraries in this path? What's the solution for this?
regards
This is a runtime error, not a build error. Setting the -L
flag does nothing for the runtime linker. What you need to do is to tell the runtime loader to also look in /usr/local/lib for libraries. You can do that in two ways. The first is to add the path to the LD_LIBRARY_PATH
environment variable:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"
The second is to update the configuration file of the runtime linker. This can happen either in the /etc/ld.so.conf file, by putting the line:
/usr/local/lib
somewhere in that file, or by creating a new *.conf file in the /etc/ld.so.conf.d/ directory that contains the new path. For example:
/etc/ld.so.conf.d/99local.conf
with just:
/usr/local/lib
in it. This is the recommended way of doing this, as it allows you to keep your custom library paths separate from paths set by the system. (The "99" prefix is there to make sure the file is loaded last compared to other files there, so that it won't preempt system paths that could contain the same libraries.)
After you modify/create the file in /etc, you need to run:
ldconfig
as root for the change to take effect. (This command updates the /etc/ld.so.cache file, which is the actual file used by the runtime linker.)
There's also another way for a binary to find needed libraries at runtime. You can actually hard-code library paths into the executable itself. This is accomplished by setting a so called "rpath". This is a linker option and must be passed from gcc (or g++) to the linker, so the -Wl
option has to be used. The linker option is -rpath=PATH
. So you would need to add this to your link flags:
-Wl,-rpath=/usr/local/lib
I don't recommend this for your case though. An rpath is useful when you're shipping libraries together with your executable (maybe with an installer), and a relative rpath (using the rpath $ORIGIN
feature) or absolute one (for when you install in /opt, for example) is then used to find those bundled libs at runtime.
这篇关于未找到/usr/local/lib 中的库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!