0 前言
gcc编译程序时,可通“-L”、“-rpath”或“-rpath-link”参数指定动态库路径,关于这3个参数的说明,有不少资料,但是看完了还是觉得模糊,分不清它们的区别。本文将用实验的方法去探讨这3个参数的区别。
1 源文件
用于本文实验的3个源文件如下所示:
(1)world.c
#include<stdio.h>
void world(void)
{
printf("world.\n");
}
(2)hello.c
#include <stdio.h>
void world(void);
void hello(void)
{
printf("hello\n");
world();
}
(3)test.c
void main(void)
{
hello();
}
2 生成动态库
参照《Linux静态库与动态库制作》,将hello.c和world.c分别生成动态库
gcc -c hello.c world.c
gcc -shared -o libhello.so hello.o
gcc -shared -o libworld.so world.o
这时,生成的文件及其依赖如下图:

由上图可见,libhello.so和libworld都依赖linux-gate.so.1、libc.so.6以及/lib/ld-linux.so.2,并且这3个库的路径都已经硬编码进libhello.so和libworld.so中了(=>右边的部分)。
然而,虽然libhello.so中调用了libworld.so的函数,但是在上图中并没有显示出此关系。为了达到使libhello.so依赖libworld.so的目的,在生成libhello.so时要链接到libworld.so:
gcc -shared -o libhello.so hello.o -lworld -L
此时,再使用ldd查看libhello.so的依赖:

由上图可见,此时libhello.so已经依赖libworld.so。
3 编译test.c
3.1 -L
由于test.c直接依赖libhello.so,因此使用-lhello -L
gcc test.c -lhello -L .
结果如下图:

&nbs