gcc以及共享库的加载

1.    预处理器头文件包含:

    gcc默认搜索头文件位置
       gcc -E prog.c -o prog.i
       cpp prog.c > prog.i

       默认搜索头文件路径:
       /usr/include
       /usr/local/include

       当使用#include 预处理指令时,
       后面的<>中填写相对于默认搜索目录的路径.
       如果使用"", 则默认先搜索当前目录, 然后
       再搜索系统目录.

       -I选项用来指定除默认搜索目录之外的头文件
    搜索路径.

2. 预处理器定义
    简单定义:
    #define MACRO_NAME REPLACE

    定义"宏函数", 带参宏:
    #define MACRO_FUNC(arg1, arg2) REPLACE

3. 条件编译
    #ifdef DEBUG
        ...
    #else
        ...
    #endif

    #ifndef XXX
        ...
    #else
        ...
    #endif

    #if 1
        ...
    #else
        ...
    #endif

    注意条件编译是在编译期编译之前处理的,
    因此它和C语言的if语句有本质的差别, 它
    不在运行时进行条件判断.

    gcc选项 -D可以用来预定义一个宏,
    ex:
        gcc -DDEBUG ...
    代表预定义DEBUG宏

4. 库(用size命令查看可执行程序的大小)
    1) 静态库生成:
    静态库(static library, archive, 后缀.a): 
        打包好的.o档.
        打包:
        ar -crv libxxx.a 1.o 2.o ...
    当应用程序使用静态库时,
    静态库和应用程序链接在一起, 应用程序中会保存有
    静态库的副本.
    静态库的缺点:
        1. 占用空间
        2. 升级不便, 每次升级都要重新链接程序.

    2). 共享库生成
    共享库(shared object, dynamic linked library,
    后缀.so):
        gcc --shared -fPIC -o libxxx.so 1.c 2.c ...
    当应用程序使用共享库时,
    链接阶段应用程序需要查询函数是否定义, 但并不将
    共享库的副本保存在应用程序中. 当应用程序开始执
    行时, 操作系统会通过保留在应用程序中的相关信息
    加载相应的共享库.
    动态库/共享库的优点:
        1. 占用空间少(硬盘占用少, 内存空间占用少)
        2. 升级方便
    缺点:
        需要将其放入系统默认动态库搜索目录或者配置
        /etc/ld.so.conf才能使用, 软件发布具有依赖性.

5. gcc 选项:
    -I: 指定gcc除默认目录外的头文件搜索目录.
    -L: 指定gcc除默认搜索目录外的库文件搜索目录.
        gcc默认搜索/lib 和 /usr/lib下的库文件.
    -l: 指定链接哪一个库. 例如, 要链接数学库libm.so
        那么编译时命令行上指定 -lm

6. 共享库加载
    系统默认到/lib /usr/lib下加载动态库.
    否则需要配置 /etc/ld.so.conf, 加入放置动态库的
    路径, 并执行ldconfig更新动态库路径信息.
原文地址:https://www.cnblogs.com/will-boot/p/3355196.html