1.1. 静态库(.a)

    1.1.1. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大。所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行。

  1.2. 动态库(.so)

    1.2.1. 动态库又名共享库。

    1.2.2. 动态库(共享库)的代码在可执行程序运行时才载入内存,在编译过程中仅简单的引用,因此代码体积比较小。所以,即使程序编译完,库仍须保留在系统上,以供程序运行时调用

  1.3. 两种区别

    1.3.1. 静态库和动态库的最大区别,静态情况下,把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度,和降低程序的耦合度。

    1.3.2. 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库

    1.3.3. 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在

二. GCC编译选项

  2.1. GCC编译流程

    a. 预处理 Pre-Processing
    b. 编译 Compiling
    c. 汇编 Assembling
    d. 链接 Linking

      2.2. gcc总体选项列表

    2.2.1. -E :只进行预编译/预处理,不做其他处理。

    2.2.2. -S :只编译,不汇编,生成汇编代码“.S”。

    2.2.3. -c :只编译,不链接,生成目标文件“.o”。

    2.2.4. -o file:把输出文件输出到file里。

    2.2.5. -g :在可执行程序中包含标准调试信息。

    2.2.6. -v :打印出编译器内部编译各过程的命令行信息和编译器的版本。

    2.2.7. -I dir :在头文件的搜索路径列表中添加dir目录

    2.2.8. -L dir :在库文件的搜索路径列表中添加dir目录

    2.2.9. -static :连接静态库(静态库也可以用动态库链接方式链接)

    2.2.10.  -llibrary :连接名为library的库文件(显示指定需要链接的动态库文件)

  2.3. gcc告警和出错选项    

    1) -ansi :支持符合ANSI标准的C程序
    2) -pedantic :允许发出ANSI C标准所列出的全部警告信息
    3) -pedantic-error :允许发出ANSI C标准所列出的全部错误信息
    4) -w :关闭所有警告
    5) -Wall :允许发出gcc提供的所有有用的报警信息
    6) -werror :把所有的告警信息转化为错误信息,并在告警发生时终止编译过程  

  2.4. gcc优化选项    

    gcc可以对代码进行优化,它通过编译选项“-On”来控制优化代码的生成,其中n是一个代表优化级别的整数。对于不同版本的gcc,n的取值范围不一致,比较典型的范围为0变化到2或者3。虽然优化选项可以加速代码的运行速度,但对于调试而言将是一个很大的挑战。因为代码在经过优化之后,原先在源程序中声明和使用的变量很可能不再使用,控制流也可能会突然跳转到意外的地方,循环语句也可能因为循环展开而变得到处都有。

三、GCC生成动态库和静态库

  3.1. 生成动态库

    3.1.1. 单个源文件/目标直接生成动态库    

a. 
gcc -fPIC -shared xxx.c -o libxxx.so
b.
gcc -fPIC -shared xxx.o -o libxxx.so
View Code

相关文章: