5 对链接的思考
5.1 函数库、链接和载入
- 编译器通常由六七个小程序组成
- 这些小程序由”编译器驱动器(compiler driver)“调用
- 这些小程序程序包括:
预处理器(preprocessor)
语法和语义检查器(syntactic and semantic checker)
代码生成器(code generator)
汇编程序(assembler)
优化器(optimizer)
连接器(linker)
还包括调用这些程序并向各程序传参的驱动器程序(driver program)
- 静态链接
函数库的一份拷贝是可执行程序的物理组成部分,称为静态链接 - 动态链接
可执行程序只包含文件名,让载入器在程序运行时能够找到所需的函数库,称为动态链接
5.2 动态链接的优点
动态链接可执行文件比相同功能的静态链接可执行文件体积小;
所有动态链接模块相同函数库的可执行文件在运行时共享该函数库的一份单独的拷贝;
静态链接库的创建和使用
- 编写头文件:hello.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif //HELLO_H
- 编写源文件:hello.c
#include <stdio.h>
void hello(const char *name)
{
printf("Hello %s!\n", name);
}
- 将hello.c编译生成.o文件
gcc -c hello.c
- 由.o文件创建静态库libhello.a文件
ar cr libhello.a hello.o
- 在程序中使用静态库文件
#include "hello.h"
int main()
{
hello("world");
return 0;
}
编译:
gcc main.c -L. -lhello //注意:-L后面的.表示在当前目录找静态库文件libhello.a
动态链接库的创建和使用
- 编写头文件:hello.h
- 编写源文件:hello.c
- 将hello.c编译生成.o文件
gcc -c hello.c
- 由.o文件创建动态库libhello.so文件
gcc -shared -fPIC -o libhello.so hello.o
将动态库文件放到/usr/lib下面
- 在程序中使用动态库文件
#include "hello.h"
int main()
{
hello("world");
return 0;
}
- 编译:
gcc main.c -L/usr/lib -lhello 或 gcc main.c -lhello