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更新动态库路径信息.