Jok*_*ter 56 linker gcc shared-libraries
有一台笔记本电脑,我没有root权限.
在机器上我安装了一个库configure --prefix=$HOME/.usr.
之后,我收到了以下文件~/.usr/lib:
libXX.so.16.0.0
libXX.so.16
libXX.so
libXX.la
libXX.a
Run Code Online (Sandbox Code Playgroud)
当我编译一个程序,该程序使用此命令调用库提供的函数之一:
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住在那里.
我的无线假设是~/.usr/lib在调用xxx.out时未搜索到的.但是我可以做些什么来指定.so的路径,以便xxx.out可以查找.so文件?
另外一个是当我-static向gcc提供时,另一个错误发生如下:
undefined reference to `function_proviced_by_the_very_librar'
Run Code Online (Sandbox Code Playgroud)
.so即使-L并且-l给予gcc 似乎也无所谓.我该怎么做才能用该库构建一个可用的exe?
它引入了静态/共享/动态加载库,以及一些使用它们的示例代码.
pel*_*lya 96
有两种方法可以实现这一目标:
-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
Run Code Online (Sandbox Code Playgroud)
这样做的好处是不会改变其他所有的库路径.
小智 5
应该LIBRARY_PATH代替LD_LIBRARY_PATH。gcc检查LIBRARY_PATH哪些可以通过-v选项查看
| 归档时间: |
|
| 查看次数: |
113290 次 |
| 最近记录: |