多文件编译的makefile编写(附当前目录下所有.c/.cpp文件编译makefile)

C代码是如何变成可以执行程序的过程:

    1、由预处理器把程序员所编写的C代码翻译成标准C代码,可以得到以.i结尾的预处理文件。
        gcc -E code.c
        gcc -E code.c -o code.i 
    2、由汇编器把标准的C代码生成汇编代码,可以得到以.s结尾的汇编文件。
        gcc -S code.i
    3、由翻译器把汇编文件生成二进制的文件,得到.o结尾的目标文件。
        gcc -c code.s
    4、由链接器把若干个目标文件合并在一起生成可执行文件,默认得到a.out。

        gcc code1.o code2.o code3.o

单文件编程:

    当只有一个.c文件,例如test.c  这时只要输入

gcc test.c -o test

    此时生成可执行文件test,只要输入./test就可以执行程序并得到结果了

 

 

多文件编程 :

    1、把一个项目分解成不同的模块,会有若干个.c,一个.c文件会生成一个.o文件,然后再最终合并成一个可以执行程序。

    2、各个.c文件各司其职,负责实现功能代码,如果相互之间需要调用,先用.h文件中的内容解决编译错误,然后在链接过程中各自寻找需要的代码。

    3、.h文件中具要负责的内容有,函数的声明,变量的声明,等一些不需要占用内存的声明语句。

    4、一般一个.h对应一个.c文件,要.c中把.h引入,如果.h与.c声明的函数不相符,会有错误提示。

 

Makefile脚本编写:

    1.用来编译代码的脚本程序,里面记录的是编译代码的步骤。

    2.在终端的命令行中执行make命令,系统会自动调用Makefile文件中的内容执行(make)。

    3.在执行make时,不是所有的.c文件都会被重新编译,只有被修改的.c文件才会再次编译(它是通过监控文件的修改时间来提高编译效率)

Makefile的主要内容:
        定义变量
            CC
            STD
            SRC
            OBJ
            BIN
            FLAG
            
        入口目标:目标名
            默认位置排列在第一个的目标是入口目标,默认只执行它。
            
        普通目标
            好比自定义函数,可以通过被依赖,达到被执行的目的。  
            普通目标也可以依赖其它普通目标,达到多个目标被执行的目的。
            
        清理目标:
            默认不执行,当程序编译成功时,把目标文件清理掉。
            或者系统时间出现问题,需要重新编译所有文件时。

            make 目标名

示例:

CC = gcc

STD = -std = gnu99

BIN = start

OBJ = main.o function.o extra_func.o

FLAG = -g

all:$(OBJ)
	$(CC) $(STD) $(FLAG) $(OBJ) -o $(BIN)

$.o:%.c
	$(CC) $(STD) -c $< -o $@

clean:
	rm $(OBJ) $(BIN)

CC为编译器  选择gcc

STD为编译标准 这里选择gnu99

BIN为可执行文件名称

OBJ为目标文件 也就是后缀为.o的文件

FLAG 为编译参数,-g为在编译的时候,产生调试信息

$()会自动替换为对应的值

clean会在每次make编译后清理目标文件和可执行文件 

CC = gcc

STD = -std=gnu99

CFLAGS = -g -Wall 
 
SRC = $(wildcard *.c)

OBJ = $(patsubst %c, %o, $(SRC))

BIN = a.out
 
all:$(OBJ)
	$(CC) $(OBJ) -o $(BIN)

%.o:%.cpp
	$(CC) $(STD) $(CFLAGS) -c $< -o $@

clean:
	rm  $(BIN) $(OBJ)

要编译多文件cpp只需要将.c换成.cpp ,gcc改成g++,-std=gnu99 换成 -std=c++0x

 

你可能感兴趣的:(C语言)