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