如何在GCC Linux中指定非默认的共享库path? 运行时出现“加载共享库时出错”
有一台笔记本电脑,我没有根特权。
到机器上我有一个库安装使用configure --prefix=$HOME/.usr
。
之后,我在~/.usr/lib
获得了这些文件:
libXX.so.16.0.0 libXX.so.16 libXX.so libXX.la libXX.a
当我编译一个程序,调用库提供的函数之一,这个命令: gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX
xxx.out没有警告就生成了,但是当我运行这个错误时抛出:
./xxx.out: error while loading shared libraries: libXX.so.16: cannot open shared object file: No such file or directory
,尽pipelibXX.so.16
驻留在那里。
我的线索假设是~/.usr/lib
在xxx.out被调用时没有被search到。 但是我能做些什么来指定.so的path,以便xxx.out可以在那里查找.so文件?
另外就是当我向gcc提供-static
时候,另外一个错误是这样的:
undefined reference to `function_proviced_by_the_very_librar'
看来。即使-L
和-l
被赋予gcc也没有关系。 我该怎么做,以build立一个可用的exe文件库?
对于和我有同样问题的其他人来说
我在tldp上find了一篇有用的文章 。
它引入了静态/共享/dynamic加载的库,以及一些示例代码来使用它们。
有两种方法可以实现这一点:
- 使用
-rpath
连接器选项:
gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX -Wl,-rpath=/home/user/.usr/lib
-
使用
LD_LIBRARY_PATH
环境variables – 把这行放在~/.bashrc
文件中:export LD_LIBRARY_PATH=/home/user/.usr/lib
即使对于预先生成的二进制文件也是如此,因此您可以从debian.org下载一些软件包,将二进制文件和共享库解压到您的主目录,然后启动它们而不用重新编译。
对于一个快速testing,你也可以做(至less在bash中):
LD_LIBRARY_PATH=/home/user/.usr/lib ./xxx.out
其优点是不会改变你的库path的一切。