如何在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的一切。