Makefile的使用和编写

一:了解Makefile

无论是C、C++、还是pas,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File,这个动作叫做编译(compile)。然后再把大量的Object File合成执行文件,这个动作叫作链接(link)

  • 在一个较大项目里,通常都有很多源代码需要编译和链接.完全手工用gcc命令进行编译工作量太大.
  • 在一项目里, 代码通常都引用关系.因此需要指定谁先编译,谁后编译.甚至是更复杂的功能操作
  • Makefile 就为解决上述一系统问题而创造的.可以把Makefile 理解成是一种由make 程序进行解释的一种特殊脚本.
  • 它跟Shell 脚本有一定相似性.如变量定义和使用,条件判断,又有自己一定的独特性.如规则的定义.
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
  • IDE环境里通常由图形界面来完成Makefile的修改.如果VC++.但通常也支持命令行的Make,如VC++的nmake,Linux 下主要是命令行界面make,通常需要开发者手工编写Makefile
  • Linux 几乎所有项目都是通过Makefile 方式编译的,如MySQL,Apache和操作系统本身,因此Linux 下开发必须掌握Makefile的编写和使用

二:Makefile的规则

目标: 依赖
	命令
  • 目标是该规则的结果
  • 依赖是生成目标所需要的依赖文件
  • 命令绝大多数情况下就是一条或者多条编译指令
  • 命令可以是任何shell命令,但要求每行命令 第一个字符必须是tab字符. 否则Make 运行会报错.这个是要特别注意的.
  • 如果 命令太长,可以用\来换行
  • Makefile 用#打头的行来表示注释
  • 综合来说:一条规则实际上就是按照命令所指定的方式,通过所有的指定的依赖文件生成最终的目标
  • 目标必须顶格写,目标和依赖文件之间使用":",多个依赖文件之间使用空格分隔,命令必须以TAB键开始

Gnu make 解释Makefile 的命令行工具
一但完成Makefile,在命令行输入make,它会自动在当前目录下查找Makefile 或makefile 进行解释

三、用例说明

比如工程student_manager中包含stu.h,stu.c,myhead.h,main.c这样几个文件,
比如将stu.c,stu.h生成stu.o就可以组成一个规则

stu.o: stu.h, stu.c
	gcc -c stu.c -o stu.o

一般在一个Makefile文件中,第一个目标为最终目标,也就是该工程编译以后的最终输出

student_manager: stu.o  main.o
	gcc stu.o main.o -o student_manager
stu.o: stu.c  stu.h
	gcc -c stu.c -o stu.o
main.o: main.c
	gcc -c main.c -o main.o

make工具在执行Makefile文件的时候,会根据目标文件和依赖文件之间的时间戳来确定目标是否需要重新生成–也就是说make工具可以根据文件之间的时间关系来确定Makefile文件中哪些指令需要执行
在student_manager工程目录下编写如下Makefile文件:

student_manager:stu.o main.o
	gcc stu.o main.o -o student_manager
stu.o:stu.c stu.h
	gcc -c stu.c -o stu.o
main.o:main.c
	gcc -c main.c -o main.o

在shell提示符下输入:

[root@localhost student_manager]# make
gcc -c stu.c -o stu.o
gcc -c main.c -o main.o
gcc stu.o main.o -o student_manager

执行完成以后,在该目录下就可以看到生成的目标文件:stu.o, main.o和student_manager

[root@localhost student_manager]# ls
head1.h  main.c  Makefile   stu.c            stu.h      stu.o
main     main.o    student_manager  
[root@localhost student_manager]# ./student_manager 
101, Jack,   88.50

如果在工程中修改了main.c,再次执行make的时候,就只会编译main.o

[root@localhost student_manager]# make
gcc -c main.c -o main.o
gcc stu.o main.o -o student_manager
  • make自动执行Makefile文件,在GNU下,Makefile文件可以是三种文件名:Makefile,gnumakefile,makefile;但通常情况下就以Makefile为文件名;make阻碍执行的时候会自动的在当前目录查找Makefile文件;如果Makefile文件不在当前目录,在使用make命令的时候,必须使用-C选项指定Makefile所在的目录
    make -C /home/student
  • 如果Makefile文件的名字不是Makefile,那么在make的时候需要通过-f选项指定make要执行的脚本文件的名字,比如当前工程中的make配置文件为maketest,使用make编译的时候,需要:
    make -f maketest

对于Makefile文件中的每一个或者多个目标可以单独执行

[root@localhost student_manager]# make stu.o
gcc -c stu.c -o stu.o
[root@localhost student_manager]# ls
head1.h  main.c   Makefile   stu.c            stu.h      stu.o
main     main.c~  Makefile~  student_manager  stu.h.bak

在Makefile中除了可以有一些编译指令以外,还可以包含linux shell命令
比如修改Makefile文件为如下:

student_manager:stu.o main.o
	gcc stu.o main.o -o student_manager
stu.o:stu.c stu.h
	gcc -c stu.c -o stu.o
main.o:main.c
	gcc -c main.c -o main.o
clean:
	rm -f *.o student_manager
[root@localhost student_manager]# make
gcc -c main.c -o main.o
gcc stu.o main.o -o student_manager
[root@localhost student_manager]# make clean
rm -f *.o student_manager

在编译完成以后可以使用make clean来删除所有编译产生的文件
在Makefile文件中,向clean这样的目标是没有依赖,只有命令,这样的目标叫做伪目标,一般情况下伪目标是用来进行管理(安装,清除等)

Makefile中变量的使用:
修改Makefile文件

VAR = gcc -c
student_manager:stu.o main.o
	gcc stu.o main.o -o student_manager
stu.o:stu.c stu.h
	$(VAR) stu.c -o stu.o
main.o:main.c
	$(VAR) main.c -o main.o
clean:
	rm -f *.o student_manager
all:student_manager
root@localhost student_manager]# make
gcc -c stu.c -o stu.o
gcc -c main.c -o main.o
gcc stu.o main.o -o student_manager

make中预先定义了一系列的变量:位置变量和编译选项变量
位置变量:
$ * : 不包括扩展名的目标文件名称 – $ *一定是用在包含扩展名的目标中表示目标的名字(不包括扩展名),对于那些本身就不包括扩展名的目标不能使用$*来表示
$+: 所有的依赖文件,以空格分隔
$<: 第一个依赖文件
$?: 所有的依赖文件
$@: 目标的完整名称
$^: 所有的依赖文件,不包括重复的文件

在Makefile文件中可以直接使用这些预定义位置变量:

VAR=gcc -c
student_manager:stu.o main.o
	gcc $+ -o $@
stu.o:stu.c stu.h
	$(VAR) $< -o $*.o
main.o:main.c
	$(VAR) $^ -o $@
clean:
	rm -f *.o student_manager
all:student_manager

Makefile文件也可以如下:

CC=gcc
VAR=$(CC) -c
CFLAGS=-W -o
student_manager:stu.o main.o
	$(CC) $+ $(CFLAGS) $@ 
stu.o:stu.c stu.h
	$(VAR) $< -o $*.o
main.o:main.c
	$(VAR) $^ -o $@
clean:
	rm -f *.o student_manager
all:student_manager
[root@localhost student_manager]# make clean
rm -f *.o student_manager
[root@localhost student_manager]# make
gcc -c stu.c -o stu.o
gcc -c main.c -o main.o
gcc stu.o main.o -W -o student_manager 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 使用gcc和makefile编写c程序,可以通过以下步骤完成: 1. 编写c程序,例如hello.c。 2. 编写makefile文件,指定编译器和编译选项,以及目标文件和依赖关系。例如: ``` CC=gcc CFLAGS=-Wall -g TARGET=hello DEPS= $(TARGET): $(TARGET).o $(DEPS) $(CC) $(CFLAGS) -o $@ $^ %.o: %.c $(CC) $(CFLAGS) -c -o $@ $< ``` 3. 在命令行中输入make命令,即可自动编译生成可执行文件。例如: ``` $ make ``` 4. 运行可执行文件。例如: ``` $ ./hello ``` 以上就是使用gcc和makefile编写c程序的基本步骤。 ### 回答2: GCC是一种广泛使用的C编译器,对于编写C程序非常有帮助。而Makefile是一种构建工具,可以自动化编译程序。下面将逐步介绍如何使用GCC和Makefile编写C程序。 一、安装GCC 在使用GCC之前,你需要在系统中安装GCC。具体安装方法可以查找相关文档或者手册。安装完成后,可以在终端输入“gcc -v”命令来查看GCC是否安装成功。 二、创建Hello World程序 首先,需要创建一个Hello World程序。在终端中使用文本编辑器来创建一个C源文件。输入以下代码: #include <stdio.h> int main(){ printf("Hello, World!\n"); return 0; } 将文件保存为hello.c。 三、编译程序 接下来需要用GCC来编译程序。运行以下命令来编译hello.c: gcc -o hello hello.c 此命令将生成一个可执行文件hello。现在就可以运行这个文件,程序会输出“Hello, World!”。 四、使用Makefile 另一种编译程序的方法是使用Makefile来编译程序。在程序根目录中创建一个名为Makefile文件。在这个文件中,你需要定义目标文件、依赖关系和编译方式。可以将上文的hello.c程序改写成Makefile的形式: CC=gcc CFLAGS=-Wall hello: hello.o $(CC) $(CFLAGS) -o hello hello.o hello.o: hello.c $(CC) $(CFLAGS) -c hello.c .PHONY: clean clean: rm -f hello *.o 在这个Makefile中,使用了变量CC和CFLAGS来指定编译器和编译选项。然后定义了两个目标文件:hello和hello.o。第一个目标文件“hello”依赖于hello.o,指定了如何编译生成可执行文件。第二个目标文件“hello.o”依赖于hello.c,指定了如何编译生成.o文件。同时还定义了一个用于清理中间文件的环节。 现在你可以运行以下命令: make 这个命令会自动读取当前目录中的Makefile文件,并编译程序。若要清除目录中生成的中间文件,可以执行以下命令: make clean 总结 以上就是使用GCC和Makefile编写C程序的基本方法。当然还有其他的编译方式,如使用IDE等,但是学习使用GCC和Makefile可以让你更深入地理解编译程序的过程。希望以上方法能够帮助到大家。 ### 回答3: C语言是一门广泛应用的编程语言,它的应用范围涉及到操作系统、网络、数据库、多媒体等众多领域。为了方便编译、运行和维护C程序,我们常常使用gcc和makefile来进行编译和构建。 gcc(GNU Compiler Collection)是一款免费开源的编译器,它支持C、C++、Objective-C、Fortran和Ada等多种编程语言。gcc的优点是它有丰富的功能和灵活的配置选项,能够生成高效的机器码,还支持调试信息的生成和优化等功能。它是编译Linux等开源系统中C程序的标准编译器,也是许多跨平台应用的首选编译器。 makefile是一种文本文件,用来指定如何构建一个工程,它包含编译规则、目标文件、依赖关系和编译选项等信息。makefile中的关键字包括target、dependencies、commands、macros和variables等,通过这些关键字可以指定程序的编译方式和运行方式。makefile的优点是它能够自动化编译和构建,减少了手动编译的繁琐和错误。 下面我们以一个简单的C程序为例,来演示如何使用gcc和makefile进行编译和构建。 首先,我们创建一个名为hello.c的C程序文件内容如下: #include<stdio.h> int main(){ printf("Hello, world!\n"); return 0; } 然后,我们使用gcc命令进行编译,生成可执行文件,命令如下: gcc -o hello hello.c 其中,“-o”选项用来指定输出文件的名称,“hello.c”为源程序文件名,“hello”为生成的可执行文件名。 接着,我们可以使用makefile来管理代码的构建过程。我们新建一个名为Makefile文件内容如下: CC=gcc CFLAGS= LDFLAGS= .PHONY: all all: hello hello: hello.o $(CC) $(LDFLAGS) $^ -o $@ hello.o: hello.c $(CC) $(CFLAGS) -c $< -o $@ 其中,“CC”是编译器名称,“CFLAGS”是编译选项,“LDFLAGS”是链接选项,“.PHONY”是一个伪目标,“all”是一个目标,表示要构建的程序名称,“hello”是目标文件,“hello.o”是依赖文件,“$(CC)”和“$<”等是变量和自动变量,用来代替具体的值。 最后,我们可以使用“make”命令来进行构建。命令如下: make all 运行以上命令后,程序即可成功编译和构建。我们可以使用“./hello”命令来运行程序,输出“Hello, world!”的内容。 以上是使用gcc和makefile编写C程序的基本流程和示例。希望能对C语言的学习和实践有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javascript_good

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值