静态链接(Static Linking)
大约 1 分钟
静态链接(Static Linking)
库是模块化软件开发中必不可少的概念,它将一下相关功能的代码组织在一起,使得程序员可以很方便地使用它们。链接(Linking)在做的事就是把各个模块之间相互引用的部分处理好,使得各个模块之间能够找到各自定义的符号。
假设我们正在模块main.c
中使用另一个模块func.c
中的foo()
函数。我们在main.c
模块中每一处调用foo
时都必须确切知道foo
函数的地址。但由于每个模块都是单独编译的。编译器在编译main.c
的时候并不知道foo
函数的地址。所以编译器会暂时把这些调用foo
的指令的目标地址搁置,等待最后链接时由链接器将这些指令的目标地址修正。这就是静态链接最基本的过程和作用。
// main.c
extern void foo();
int main() {
foo();
return 0;
}
// func.c
void foo() {
printf("Hello World!");
}
下面我们使用gcc编译器来进行静态链接。首先我们需要将main.c
和func.c
编译成目标文件,然后再将目标文件链接成可执行文件。
$ gcc -c main.c -o main.o
$ gcc -c func.c -o func.o
$ gcc main.o func.o -o main # 静态链接
我们可以使用nm
命令来查看目标文件中的符号信息。
$ nm main.o
0000000000000000 T main
$ nm func.o
0000000000000000 T foo