面试题答案
一键面试创建静态库关键步骤
- 编写源文件:编写实现各种功能的C语言源文件,例如
add.c
、sub.c
等,每个文件包含相应功能的函数定义。 - 编译目标文件:使用
gcc -c
命令将源文件编译成目标文件。例如,对于add.c
,执行gcc -c add.c
,会生成add.o
。多个源文件都需进行此操作。 - 创建静态库:使用
ar
工具将目标文件打包成静态库。例如,执行ar rcs libmylib.a add.o sub.o
,这里libmylib.a
是静态库文件名,add.o
和sub.o
是前面生成的目标文件。
创建动态库关键步骤
- 编写源文件:同样编写包含功能函数定义的C语言源文件,如
func.c
。 - 编译生成共享目标文件:使用
gcc -fPIC -c
命令编译源文件。-fPIC
选项生成位置无关代码,例如gcc -fPIC -c func.c
,生成func.o
。 - 创建动态库:使用
gcc -shared
命令将共享目标文件链接成动态库。例如,gcc -shared -o libmydll.so func.o
,libmydll.so
是动态库文件名。
编译和链接过程中的主要区别
- 编译:
- 静态库:源文件编译成目标文件时,与普通编译相同,不涉及特殊选项。
- 动态库:编译源文件生成目标文件时,需使用
-fPIC
选项,生成位置无关代码,以便动态库能在内存的不同位置加载运行。
- 链接:
- 静态库:链接时,链接器将静态库中被程序调用的函数代码直接复制到可执行文件中。最终生成的可执行文件包含了所需的全部代码,因此可执行文件相对较大。如果多个程序使用相同的静态库,每个程序都会有一份库代码的拷贝,会占用较多磁盘空间。
- 动态库:链接时,链接器仅记录可执行文件对动态库中函数的引用信息,并不将库代码复制到可执行文件中。在程序运行时,操作系统负责将动态库加载到内存,多个程序可以共享内存中的同一份动态库代码,节省内存空间。但动态库依赖于运行时环境,若运行环境中没有相应的动态库,程序将无法运行。