链接程序和库指南

链接编辑器搜索的目录

上面所有示例都假定链接编辑器了解在哪里搜索命令行中列出的库。缺省情况下,在链接 32 位目标文件时,链接编辑器只知道在三个标准目录中查找库:先搜索 /usr/ccs/lib,然后搜索 /lib,最后搜索 /usr/lib。在链接 64 位目标文件时,只使用两个标准目录:先搜索 /lib/64,然后搜索 /usr/lib/64。必须显式地将要搜索的所有其他目录添加到链接编辑器的搜索路径中。

可以使用命令行选项或环境变量来更改链接编辑器的搜索路径。

使用命令行选项

可以使用 -L 选项将新的路径名添加到库搜索路径中。在命令行中遇到此选项时,将改变搜索路径。例如,以下命令搜索 path1,然后搜索 /usr/ccs/lib/lib,最后搜索 /usr/lib 来查找 libfoo。此命令搜索 path1,然后搜索 path2,接着搜索 /usr/ccs/lib/lib/usr/lib 来查找 libbar


$ cc -o prog main.o -Lpath1 file1.c -lfoo file2.c -Lpath2 -lbar

使用 -L 选项定义的路径名仅由链接编辑器使用。这些路径名不会记录在要创建的输出文件映像中。因此,运行时链接程序不能使用这些路径名。


注 –

如果要链接编辑器在当前目录中搜索库,则必须指定 -L。可以使用句点 (.) 来表示当前目录。


可以使用 -Y 选项更改链接编辑器搜索的缺省目录。随此选项提供的参数采用以冒号分隔的目录列表形式。例如,以下命令仅在目录 /opt/COMPILER/lib/home/me/lib 中搜索 libfoo


$ cc -o prog main.c -YP,/opt/COMPILER/lib:/home/me/lib -lfoo

可以使用 -L 选项补充使用 -Y 选项指定的目录。

使用环境变量

还可以使用环境变量 LD_LIBRARY_PATH(采用冒号分隔的目录列表形式)将要搜索的目录添加到链接编辑器的库搜索路径中。LD_LIBRARY_PATH 最常见的形式是以分号分隔的两个目录列表。系统按照命令行中提供的列表依次进行搜索。

以下示例说明在设置 LD_LIBRARY_PATH 且调用链接编辑器时使用多个 -L 的情况下所得结果:


$ LD_LIBRARY_PATH=dir1:dir2;dir3

$ export LD_LIBRARY_PATH

$ cc -o prog main.c -Lpath1 ... -Lpath2 ... -Lpathn -lfoo

有效搜索路径为 dir1:dir2:path1:path2... pathn:dir3:/usr/ccs/lib:/lib:/usr/lib

如果在 LD_LIBRARY_PATH 定义中未指定分号,则将在解释所有 -L 选项之后解释指定的目录列表。在以下示例中,有效搜索路径为 path1:path2... pathn:dir1:dir2:/usr/ccs/lib:/lib:/usr/lib


$ LD_LIBRARY_PATH=dir1:dir2

$ export LD_LIBRARY_PATH

$ cc -o prog main.c -Lpath1 ... -Lpath2 ... -Lpathn -lfoo

注 –

还可以使用此环境变量扩充运行时链接程序的搜索路径。 请参见运行时链接程序搜索的目录。为了防止此环境变量影响链接编辑器,请使用 -i 选项。