在我的UNIX机器上,我发现默认情况下二进制文件正在查找“/lib
”目录中的相关共享库,即使'PATH
'中未配置'/ lib'目录LD_LIBRARY_PATH
'变量。
我在下面看到库'libssl.so.4'可以在'/ lib'目录中找到。
bash-3.00$ ldd openssl
/lib/libcwait.so (0x00f86000)
libssl.so.4 => /lib/libssl.so.4 (0x00408000)
我的'PATH'和'LD_LIBRARY_PATH'如下:
bash-3.00$ echo $LD_LIBRARY_PATH
:/opt/oracle/product/11.2.0/client32/lib:
bash-3.00$ echo $PATH
/opt/pure/releases/purify.hp.2003a.06.15.FixPack.0214/cache/opt/star-ncf-prod/ep_patch/usr/lib:/usr/ccs/bin:/usr/bin:/usr/ucb:/etc:/bin:.:/opt/ccm71/bin:/opt/oracle/product/11.2.0/client32/bin:/opt/tools/bin:/usr/local/bin
默认情况下,请让mw知道二进制文件是否引用'/ lib'目录?
答案 0 :(得分:0)
为了使可执行文件能够在运行时找到要链接的所需库,必须配置系统以便可以找到库。可用方法:(至少做以下其中一项)
添加要在动态链接到文件/etc/ld.so.conf
期间包含的库目录示例:/etc/ld.so.conf
/usr/X11R6/lib
/usr/lib
...
/usr/lib/sane
/usr/lib/mysql
/opt/lib
将库路径添加到此文件,然后执行命令(以root身份)ldconfig以配置链接器运行时绑定。
您可以使用" -f文件名"如果您正在为不同的环境开发,则标记以引用另一个配置文件。
有关命令ldconfig
OR
将指定目录添加到库缓存:(以root身份) ldconfig -n / opt / lib 其中/ opt / lib是包含库libctest.so的目录 (开发时只需添加当前目录:ldconfig -n。与-L链接。) 这不会永久配置系统以包含此目录。系统重启后信息将丢失。
OR
指定环境变量LD_LIBRARY_PATH以指向包含共享对象库的目录路径。这将指定运行时加载程序在执行期间将使用库路径来解析依赖关系。 (Linux / Solaris:LD_LIBRARY_PATH,SGI:LD_LIBRARYN32_PATH,AIX:LIBPATH,Mac OS X:DYLD_LIBRARY_PATH,HP-UX:SHLIB_PATH)
示例(bash shell):export LD_LIBRARY_PATH = / opt / lib:$ LD_LIBRARY_PATH或添加到〜/ .bashrc文件中:
`...
if [ -d /opt/lib ];
then
LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH
fi
...
export LD_LIBRARY_PATH`
这指示运行时加载程序查看环境变量LD_LIBRARY_PATH描述的路径,以解析共享库。这将包括路径/ opt / lib。 使用的库路径应符合" Linux标准基础"目录结构。
答案 1 :(得分:0)
阅读ld.so(8),ldd(1)和dlopen(3)手册页以及Drepper's paper: How To Write Shared Libraries
您将看到“如果库依赖项不包含斜杠,则会搜索它
for { at last in /lib
then /usr/lib
这两个目录是内置的,即在动态链接器的代码中连接,例如,在我的Debian系统上/lib64/ld-linux-x86-64.so.2
(我猜 - 但我不确定 - 我的Debian /lib64/
上也连接了。)