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 hello
hello: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初学指南”