test.h
#pragma once
#include<stdio.h>
//函数的声明
extern void show();test.c
#include "test.h"
void show()
{
printf("hello");
}main.c
#include "test.h"
int main()
{
show();
return 0;
}形成main.c的可执行程序hello:
gcc -o hello main.c test.c注意:
gcc main.c test.c -o hello也是可以的这里可能会产生疑问:test.h里包含了show方法的声明,为什么不依赖这个头文件呢
因为头文件在预处理阶段已经在main.c 和test.c 里面展开了
makefile写法:
#makefile
hello:main.c test.c
gcc main.c test.c -o hello #此处开头一定是缩进
.PHONY:clean
clean:
rm -f hellohello:main.c test.c 为二者的依赖关系,gcc main.c test.c -o hello为依赖方法clean:也为一个依赖关系,依赖关系是可以没有依赖对象的,这个就没有。.PHONY为makefile里的一个关键字,作用是使后面的方法“总是被执行”stat 文件查看文件信息:

.PHONY:clean作用就是无论可执行程序hello的新旧、是否存在,总是会执行rm -f hello来删除掉hellomake来执行makefile里的生成可执行程序的依赖方法。指令make clean来执行makefile里面删除hello的方法c、cpp程序执行过程:

.c .h 预处理(头文件展开等) 形成.i
gcc指令为
gcc -E test.h test.c,可以加-o选项指定生成的名称,默认名称跟.c文件的名称一样,下同
编译形成 .s汇编文件
gcc指令为
gcc -S test.i
汇编形成 .o二进制文件(目标文件)
gcc指令为
gcc -c test.s此处“目标文件”含义和上面makefile中的“目标文件”含义不同,makefile中的含义是目标要形成的文件,而此处的名字就叫做”目标文件“
(与库文件)链接形成 -out可执行程序
gcc指令为
gcc test.s,默认生成文件名称为a.out,可以加-o选项指定名称,名称可不加.out后缀文件后缀的记忆方法:iso gcc指令的记忆方法:ESc,c是小写
注意,gcc指令是的含义是”进行到这一步为止“,因此每步的gcc指令并不依赖上一步的生成的文件
比如可以直接令.c文件进行到汇编结束,生成.o文件gcc -c test.c
或者直接.c文件生成可执行程序gcc test.c
在一般的编译器下,会保留生成.o目标文件,然后将目标文件统一链接形成可执行文件
几个.c源文件就会生成几个.o目标文件
如果想要在makefile中,先形成.o目标文件,然后再链接形成可执行文件,写法为:
hello:test.o main.o
gcc test.o main.o -o hello
test.o:test.c
gcc -c test.c
main.o:main.c
gcc -c main.c
.PHONY:clean
clean:
rm -f *.o hello更多内容查看“Makefile初学指南”