预编译

    g++ -E test.c -o test.i


则做了以下处理:

    删除所有#define,并展开所有宏定义

    处理所有条件预编译指令,如#ifdef等

    处理#include 预编译指令, 把#include 头文件中的函数都声明都扔进来

    去掉所有的注释

    添加行号,编译gdb调试

    保留¥pragma



编译:  g++ -S test.i -o test.s

编译过程:

    词法分析:

        经过扫描,把代码句转为一堆记号。

    语法分析:

        生成语法树。

    语义分析:

        给语法树标识上类型。

    中间语言生成:

        进行一系列优化,例如(2+7)可以被优化掉

    目标代码的生成和优化:

        生成了汇编代码


链接:

   各目标文件和静态库进行了连接。




Makefile的编写

test程序需要2个链接文件合成,依赖这2个链接文件 :

test: file1.o file2.o

     g++ file1.o file2.o -o  helloword

而file1.o则由file1.cpp生成

file1.o: file1.cpp

    g++ -c file1.cpp -o file1.o

而file2.o则由file2.cpp和file2.h生成

file2.o: file2.cpp file2.h

    g++ -c file1.cpp -o file2.o


执行make clean时,则执行

clean:

    rm -rf *.o test



可使用变量,有点像宏定义

即可让XX = g++

CC = gcc

$(XX) 或者$(CC) 就可以拿来用了


CFLAGS = -Wall -O -g

Wall指输出警告信息

-O(大O) 在编译时进行优化

-g 指可以作debug

那么CFLAGS每次就可以加在生成file.o那里


OBJS = file1.o file2.o

则指代连接要用的那些文件


函数:

    可用wildcard  加 patsubst得出所需要的.o文件

    

%.o: %.c

    $(CC) $(CFLAGS) -c $< -o $@

则把所有的.c文件编译成.o文件


$<指   依靠列表中的第一个文件

$@指  目的文件名,一般就是那些.o文件

$^指 整个依靠的列表