连接动态链接库时找不到链接库的解决办法

时间:2022-01-23 08:46:30

连接动态链接库时找不到链接库的解决办法

链接动态库时,可能会出现无法找到链接库的错误,如果用ldd命令就能查看到可执行文件的所有依赖的库。在《linux c一站式编程》一书中看到了一些解决办法,先总结如下四中办法:

方法一

如果只是在开发中临时使用一下,可以使用 LD_LIBRARY_PATH 这个变量进行设置

EXPORT LD_LIBRARY_PATH=当前所依赖的库的路径

这种办法只是临时有效,如果重新启用一个终端,就需要重新设置一次。

方法二

连接动态链接库是由动态链接器决定的,那么首先需要知道动态链接器是如何查找库的。

  • 首先在环境变量 LD_LIBRARY_PATH 所记录的路径中查找,如果没有找到,就进行下一步
  • 从缓存文件 /etc/ld.so.cache 中查找,在root权限下,使用ldconfig命令,读取 /etc/ld.so.conf 文件并生成该缓存文件
  • 如果以上两种办法都没有找到动态库,那么动态链接器会在系统默认路径中查找,先在 /usr/lib/ 中查找,然后再 /lib 中查找

那么,根据以上动态链接器查找库的方法,将库的路径写入 /etc/ld.so.conf 文件中,然后运行ldconfig(ldconfig -v可以查看详细信息),就能生成缓存文件,连接器就能找到库文件

方法三

直接将库文件复制一份到/usr/lib 或者 /lib 目录中,让动态链接器在系统默认路径中查找

方法四

在使用gcc编译时,添加选项 -Wl,-rpath,动态库的路径, 表示-rpath 动态库路径 是由gcc传递给链接器的选项。

gcc main.c -g -L. -lstack -Istack -o main -Wl,-rpath,$PWD

gcc 编译 main.c ,链接动态库libstack.so,头文件在 ./stack目录中,制定的库文件路径在当前路径中