跳至主要內容

静态链接(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.cfunc.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