链接程序和库指南

具有依赖项的共享库

共享库可以具有自己的依赖项。运行时链接程序查找共享库依赖项使用的搜索规则在运行时链接程序搜索的目录中介绍。如果共享库没有位于其中一个缺省搜索目录中,则必须将查找位置明确告知运行时链接程序。 对于 32 位目标文件,缺省搜索目录为 /lib/usr/lib。对于 64 位目标文件,缺省搜索目录为 /lib/64/usr/lib/64。指明非缺省搜索路径要求的首选机制是在具有依赖项的目标文件中记录运行路径。可以使用链接编辑器的 -R 选项来记录运行路径。

在以下示例中,共享库 libfoo.so 依赖于 libbar.so,而在运行时预期后者位于目录 /home/me/lib 中,如果在该目录中未找到该项,则该项位于缺省位置中。


$ cc -o libbar.so -G -K pic bar.c

$ cc -o libfoo.so -G -K pic foo.c -R/home/me/lib -L. -lbar

$ dump -Lv libfoo.so



libfoo.so:



  **** DYNAMIC SECTION INFORMATION ****

.dynamic:

[INDEX] Tag      Value

[1]     NEEDED   libbar.so

[2]     RUNPATH  /home/me/lib

.........

共享库负责指定查找其依赖项所需的所有运行路径。所有在动态可执行文件中指定的运行路径只用于查找动态可执行文件的依赖项。不能使用这些运行路径来查找共享库的任何依赖项。

环境变量 LD_LIBRARY_PATH 的范围更具全局性。运行时链接程序使用借助此变量指定的所有路径名来搜索任意共享库依赖项。虽然此环境变量可用作影响运行时链接程序搜索路径的临时机制,但是强烈建议不要在生产软件中使用此变量。有关更全面的介绍,请参见运行时链接程序搜索的目录