+------------------+
| gcc -E |
|----------------->|
|---------------------------------+
| gcc -S |
|---------------------------------------------------+
| gcc -c |
|------------------+--------------+---------------->|
|--------------------------------------------------------------------------+
| gcc |
|------------------+--------------+-----------------+---------------------->
.pc预编译-->.c 译.i 汇编文件.s 二进制文件.o;.h.gch 链接成可执行文件
| 去注释 |词法分析 |二地址码或 | |
|宏值引入 |语法分析 |三地址码 | 静态链接.a/dll |
|外部函数声明引入 |语义分析 | | 动态连接.so/lib |
|结构体引入 | | | |
|预处理#指令查错 | | | |
---------------------------------------------------------------------------+
ar:
打包成档案.a静态
$(TARGET):$(OBJ)
@$(AR) rv $(TARGET) $(OBJ)
.c.o:
@$(CC) $(CFLAGS) -c $*.c $(H_INCLUDES)
-----------------------------------------------
libxxx.a直接或软连接
很多.o打包,使用ar -t libxxx.a 查看包内文件数量
链接成可执行文件以后,可删除.a(对于第三方的一般经常用也不会特意删除)
数据段、代码段均载入可执行文件中
需要有头文件.h用于调用到的程序生成
调用的程序的编译的CFLAGS选项需要一致,否则不兼容报错等
USAGE:
A_LIBs= -L../lib -static -lxxx
$(CC) $(pOBJs) $(CFLAGS) $(A_LIBs) -o $@
-----------------------------------------------
生成动态连接.so
gcc 1.c 2.c ....n.c $(H_INCLUDES) -fPIC -shared -o libxxx.so
libxxx.so直接或软连接
使用ld查看
链接成可执行文件后不可删除(相对静态生成可执行文件较小,但是寻址用到时可能会比较耗时间)
数据段使用到的每个程序均载入,代码段多个程序共用
需要有头文件.h用于调用到的程序生成
调用的程序的编译CFLAGS选项需要一致,否则不兼容报错等
USAGE:
SO_LIBs= -L../lib -lxxx
$(CC) $(pOBJs) $(CFLAGS) $(SO_LIBs) -o $@
gcc_预处理_编译_汇编_连接
最新推荐文章于 2023-02-09 22:32:31 发布