这是运行时错误,而不是构建错误。设置-L
标志对运行时链接器没有任何作用。您需要做的是告诉运行时加载器也在 /usr/local/lib 中查找库。您可以通过两种方式做到这一点。首先是添加路径LD_LIBRARY_PATH
环境变量:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"
其次是更新运行时链接器的配置文件。这可以在 /etc/ld.so.conf 文件中发生,只需输入以下行:
/usr/local/lib
该文件中的某处,或者通过在包含新路径的 /etc/ld.so.conf.d/ 目录中创建新的 *.conf 文件。例如:
/etc/ld.so.conf.d/99local.conf
只是:
/usr/local/lib
在里面。这是推荐的方法,因为它允许您将自定义库路径与系统设置的路径分开。 (“99”前缀是为了确保该文件与其他文件相比是最后加载的,这样它就不会抢占可能包含相同库的系统路径。)
在 /etc 中修改/创建文件后,您需要运行:
ldconfig
作为 root 使更改生效。 (此命令更新 /etc/ld.so.cache 文件,这是运行时链接器使用的实际文件。)
二进制文件还有另一种在运行时查找所需库的方法。实际上,您可以将库路径硬编码到可执行文件本身中。这是通过设置所谓的“rpath”来完成的。这是一个链接器选项,必须从 gcc(或 g++)传递到链接器,因此-Wl
必须使用选项。链接器选项是-rpath=PATH
。因此,您需要将其添加到链接标志中:
-Wl,-rpath=/usr/local/lib
不过,我不建议您这样做。当您将库与可执行文件(可能与安装程序一起)和相对 rpath(使用rpath $ORIGIN
然后使用绝对一(例如,当您安装在 /opt 中时)在运行时查找这些捆绑的库。