有一台我没有root权限的笔记本电脑。
在机器上我使用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
,虽然libXX.so.16
位于那里。
我的无线假设是在调用xxx.out时未搜索~/.usr/lib
。
但我该怎么做才能指定.so的路径,以便xxx.out可以查找.so文件?
添加是当我将-static
提供给gcc时,会发生另一个错误:
undefined reference to `function_proviced_by_the_very_librar'
即使.so
和-L
被赋予gcc,似乎-l
无关紧要。
如何用该库构建可用的exe?
它引入了静态/共享/动态加载库,以及一些使用它们的示例代码。
答案 0 :(得分:90)
有两种方法可以实现这一目标:
-rpath
链接器选项: gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX -Wl,-rpath=/home/user/.usr/lib
使用LD_LIBRARY_PATH
环境变量 - 将此行放在~/.bashrc
文件中:
export LD_LIBRARY_PATH=/home/user/.usr/lib
这甚至可以用于预先生成的二进制文件,因此您可以从debian.org下载一些软件包,将二进制文件和共享库解压缩到您的主目录中,然后启动它们而无需重新编译。
对于快速测试,你也可以(至少在bash中):
LD_LIBRARY_PATH=/home/user/.usr/lib ./xxx.out
,其优点是不会更改其他所有内容的库路径。