动态链接库和静态链接库
Dynamic Library and Static Library

动态库和静态库

动态库的优势和劣势

静态库的优势和劣势

Linux平台的静态库

静态库的生成

 默认就是在编静态库,-c要求只预处理、编译,不链接。
 > gcc -c hello.c
 用ar命令将.o文件归档.a文件。
 > ar -r libhello.a  hello.o

静态库的链接

 -static选项是告诉编译器,-L大写的L指明库所在的目录,-l小写的L是在指出需要的动态库,hello是静态库。
 > gcc main.c -static -L .  -lhello  -o  main

Linux平台的动态库

动态库的生成

 在使用GCC编译程序时,只需加上-shared选项,
 > gcc hello.c -fPIC -shared -o libhello.so

动态库的链接

 不加-static选项,-l小写的L是在指出需要的动态库。
 > gcc main.c -L . -lhello -o main

Windows平台的静态库

静态库的生成

/MT 使用 LIBCMT.lib 编译以创建多线程可执行文件。 生成静态库lib。

静态库的链接

Windows平台的动态库

动态库的生成

/MD 使用 MSVCRT.lib 编译以创建多线程 DLL。生成动态库。

动态库的链接

符号表 symbol table

符号

符号就是其实程序中的变量名、函数名。每个可重定位目标模块m都有一个符号表,它包含了在m中定义和引用的符号。有三种链接器符号:

符号定义的本质是:指被分配了存储空间。如果是函数名则指代码所在区;如果是变量名则指其所在的静态数据区。所有定义的符号的值就是其目标所在的首地址。

链接器对符号的解析规则 符号解析时,只能有一个确定的定义(即每个符号仅占一处存储空间)。

符号表

符号表是编译期产生的一个hash列表,随着可执行文件在一起。符号表包括了变量和函数的信息,以及调试信息。 区分debug版本和release 版本的方法就是看符号表里有没有调试符号了

符号表的生成: 符号表在编译的词法分析的时候,一直向符号表里填入符号,例如有重复定义的时候会报错,因为符号表已经存在该符号了。

符号表的使用: 链接的时候,链接器会去符号表查找引用的符号是否存在 对于常量,编译器会向符号表查找const的值,直接替换

*****
Written by Lu.dev on 14 July 2016