Ubuntu下用glade和GTK+开发C语言界面程序(三)——学习make的用法

makefile的规则

makefile的规则如下:

target ... : prerequisites ...
	command
	...
	...

target可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个label。

prerequisites就是要生成那个target所需要的文件或者目标。

command就是make需要执行的命令。(任意的shell命令)

这三者的关系就是一个文件依赖关系,target这一个或者多个目标文件依赖与prerequisites中的文件,其生成规则定义在command中。这其中的主要意思就是,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是makefile中最核心的内容。

一个简单的示例

一个工程中有3个头文件,8个c文件,下面的makefile定义了这个工程编译的规则。

edit : main.o kbd.o command.o display.o 		insert.o search.o files.o utils.o
	cc -o edit main.o kbd.o command.o display.o 		insert.o search.o files.o utils.o

main.o : main.c defs.h
	cc -c main.c
kbd.o : kbd.c defs.h command.h
	cc -c kbd.c
command.o : command.c defs.h command.h
	cc -c command.c
display.o : display.c defs.h buffer.h
	cc -c display.c
insert.o : insert.c defs.h buffer.h
	cc -c insert.c
search.o : search.c defs.h buffer.h
	cc -c search.c
files.o : files.c defs.h buffer.h command.h
	cc -c files.c
utils.o : utils.c defs.h
	cc -c utils.c
clean :
	rm edit main.o kbd.o command.o display.o 		insert.o search.o files.o utils.o

将上面内容保存为文件名为“makefile”或者“Makefile”的文件中,直接到命令行中进入这个文件的目录中,执行make命令,即可生成所需要的可执行文件edit,如果要删除执行文件和所有的中间文件,一个简单的make clean 命令即可。

在上面的makefile中,目标文件(target)包含:执行文件edit和中间目标文件(*.o),依赖文件(prerequisites)就是冒号后面的那些.c文件和.h文件。同时可以看出来,每一个.o文件中都有一组依赖文件,而这些.o文件又是执行文件edit的依赖文件,依赖关系的实质上就是说明了目标文件是由哪些文件生成的。

上面的依赖关系搞清楚后,下面的那一行定义了如何生成目标文件的系统命令,这个命令以一个tab键作为开头。这个是一个特别需要注意的地方。make不管命令是如何工作的,它只管执行你所写的命令,make会比较target文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets的文件日期要新,或者target文件不存在的话,make就会执行命令。

最后面定义的clean不是一个文件,只是一个命令的名字,make不会去找clean的依赖文件,其后也没有跟依赖文件,要执行这个clean命令,需要在命令中指出这个命令的标签名字,比如make clean,这个clean就是标签,make就会在其文件中找到clean这个标签下面对应的命令,来执行相应的命令。

make的工作方式

在默认方式下,也就是我们只需要输入make命令。

1、make会在当前目录下找名字为“Makefile”或者“makefile”的文件。

2、如果找到,它会找文件中的第一个目标文件(target),在上面的makefile文件它会找到“edit”这个文件,并把这个文件作为最终的目标文件。

3、如果edit文件不存在,或是edit所以来的后面的.o文件的修改时间要比这个edit文件新,那么,他就会执行后面所定义的命令来生成这个edit文件。

4、如果上面的.o文件也不存在的话,那么make会在当前文件中找目标为.o文件的依赖性,最后执行命令生成相应的.o文件。

5、只要可以找到.h文件和.c文件,那么make就会执行它的命令来最终生成目标文件edit。

上面的工作方式是一层一层的依赖关系。make只管根据具体的依赖关系在当前文件夹中搜寻所需要的文件,如果找不到所需的文件,那么make就会直接退出。并报错,对于所定义的命令的错误,或者是编译不成功。make根本不管这些东西,make只是根据所定义文件的依赖关系来执行你所定义的命令,如果中间有差错,那么make直接退出不在执行命令。

在上面的规则中,像clean这种没有依赖文件关系,后面只跟了一条命令的话,当执行make的时候这种命令不会执行,但是可以在make后面显示的声明这个命令来执行。例如make clean,这样就执行了clean后面所定义的命令,将生成的所有中间文件和目标文件清理,以便于重新编译。

在编译过程中,如果这个工程被编译过了,当我们修改了其中的一个文件,那么根据make的规则,make不会再去编译其他已经生成好了的目标文件,智慧重新编译这个被修改的文件,并生成最终的目标文件,这就是make只管那些依赖文件的时间是否比这个目标文件的时间新,是的话,就会重新编译这个文件,其他的不管,并最终链接成所需要的最终的目标文件edit。

makefile中使用变量

在上面的例子中,我们可以看到edit后面跟的依赖文件和命令中对【.o】文件重复了两次,如果我们要引入一个.o文件,或者修改一个.o文件的名字,那么我们需要修改三个地方,edit里面有两个,和下面的一个.o文件,这在小的工程中修改还算容易,但是一个工程要是比较大的话,那么makefile写的会比较大且复杂,那时就有可能忘记修改某个地方。所以为了makefile的易于维护,在makefile中可以使用变量,makefile的变量其实也就是定义了一些字符串,可以理解成C语言中的宏定义。

比如我们可以声明一些变量来代表目标文件,如:OBJECT,obj,objects都行。可以在makefile中按如下定义变量。

objects = main.o kbd.o command.o display.o 		insert.o search.o files.o utils.o

那么我们在makefile中就可以以"$(objects)"的方式来使用这个变量了。于是makefile就可以改为下面的方式:

objects = main.o kbd.o command.o display.o 		insert.o search.o files.o utils.o

edit : $(objects)
	cc -o edit $(objects)
main.o : main.c defs.h
	cc -c main.c
kbd.o : kbd.c defs.h command.h
	cc -c kbd.c
command.o : command.c defs.h command.h
	cc -c command.c
display.o : display.c defs.h buffer.h
	cc -c display.c
insert.o : insert.c defs.h buffer.h
	cc -c insert.c
search.o : search.c defs.h buffer.h
	cc -c search.c
files.o : files.c defs.h buffer.h command.h
	cc -c files.c
utils.o : utils.c defs.h
	cc -c utils.c
clean :
	rm edit $(objects)

这样我们修改[.o]文件的时候只需要简单的在变量objects中修改就可以了。

清空文件目标的规则

每个makefile中都应该有一个清空目标文件(.o和可执行文件),这不仅便于编译,也可以保持文件的清洁。

一般的清空规则如下:

clean:
	rm edit $(objects)

更稳健的方式如下:

.PHONY : clean
clean :
	-rm edit $(objects)

.PHONY意思表示clean是一个"伪目标"。在rm命令前面加了一个减号的意思为,也许某些文件出现问题,但不用管,继续做后面的事,当然,clean规则一般都是放在makefile的文件的最后,这也是个不成文的规则。

当然这里只是介绍了make的一些简单知识,这些知识足够写一些小系统的编译了,如果有兴趣的同学可以找本专门介绍make的书籍来读一下,加深自己对make的一些理解。

时间: 2024-10-06 01:19:32

Ubuntu下用glade和GTK+开发C语言界面程序(三)——学习make的用法的相关文章

Ubuntu下用glade和GTK+开发C语言界面程序(一)

前言:对于大学中计算机系的每年暑假的课设有太多想说的,能从中学到很多东西,当然不排除打酱油的,这些可以掠过哦,凡事都打酱油,人生也是打酱油的吧.2333. 对于大三以前的课设一般的要求都是用C写的,即使你学的面向对象很好,也只能老老实实的来用C写.当然这其中还有好多要说道的东西. 用C写,面对windows下的那不能再吐槽的cmd终端,我就不说太多了,因为已经很少到windows上做东西.用C写,又想写的高大上一点,当然要有图形界面了,在linux上用C写界面程序,GTK+是少不了的,但是运用面

Ubuntu下用glade和GTK+开发C语言界面程序(二)——gcc常用命令介绍

谈到linux,没人不懂gcc,当然,学过C语言的都该知道gcc,毕竟所有的类C编译器基本都有gcc来构成. GCC的意思随着时间的发展也从最初的GNU C Compiler发展到GNU Compiler Collection,也就是GNU编译器的统称集合.GCC对与操作系统与硬件的的支持,可以说是:无处不在. 一.gcc编译过程 GCC的编译过程要分为四个阶段来进行:预处理阶段,编译阶段,汇编阶段,以及链接阶段. 1.预处理阶段(也称预编译阶段) gcc -E helloworld.c -o

【转载】在Ubuntu下配置舒服的Python开发环境

在Ubuntu下配置舒服的Python开发环境 2013-10-26 00:10 11188人阅读 评论(0) 收藏 举报 目录(?)[+] Ubuntu 提供了一个良好的 Python 开发环境,但如果想使我们的开发效率最大化,还需要进行很多定制化的安装和配置.下面的是我们团队开发人员推荐的一个安装和配置步骤,基于 Ubuntu 12.04 桌面版本标准安装. 安装 Python 发布版本和 build 依赖包 建议至少安装 Python 2.7/3.2 版本,毕竟 Python 2.X/3.

Ubuntu下搭建Cocos2D-X 3.6开发环境

简单讲解在Ubuntu下搭建Cocos2D-X 3.6开发环境的过程,希望对大家有用. 1.解压下载的包,找到build目录: 在终端下先执行install-deps-linux.sh文件 结果类似: 时间可能比较长. 2.回到解压包的根目录下执行setup.py: 可以看出这个执行完成的是检测系统环境并在配置文件中加入需要的环境变量,会将原配置文件备份. 3.在解压包的目录运行 cmake . 注意后面代表当前目录的 . (不要在意sudo) 4.make 用cmake生成的Makefile就

(4)Linux(ubuntu)下配置Opencv3.1.0开发环境的详细步骤

Ubuntu下配置opencv3.1.0开发环境 1.最近工作上用到在Ubuntu下基于QT和opencv库开发应用软件(计算机视觉处理方面),特把opencv的配置过程详细记录,以供分享 2.步骤说明 一.安装OpenCV3.1.0 1.使用wget下载opencv源码 url : https://github.com/Itseez/opencv/archive/3.1.0.zip sudo apt-get install wget sudo wget https://github.com/I

VC开发多语言界面 多种方法(很简单) 有源码

(需源码先留邮箱)先上图 1.通过遍历 得到所有控件ID号与TEXT,得到一个中文语言配置文件 void CVV_485Dlg::getCaptionForWindow() //做程序时用,其它时间不用 { //枚举对话框中所有组件 CWnd *pCtrl = GetWindow(GW_CHILD); while(pCtrl!=NULL) { UINT ctrlID = pCtrl->GetDlgCtrlID(); // setControlCaption(pCtrl,ctrlID); CStr

39 Ubuntu下配置python的vscode开发环境

0 引言 最近想在ubuntu下搞深度学习,首先配置了python的vscode开发环境.在配置python时,选择了Anaconda3.x,保证了其相对于系统python2.x的独立性.另外,vscode是单独安装的,其路径添加到环境变量中,安装完Anaconda3.x之后,启动其桌面客户端,即可看到vscode躺在列表中.启动vscode,配置python开发环境,并修正一些pylint的bug,即可享受. 1 安装VSCode (1)去这儿下载.deb版本的安装包 https://code

在ubuntu上使用wxWidgets成功开发一个图形界面程序

编译wxWidgets 下载最新版的源码,wxWidgets-3.0.2.wxWidgets在liunx是通过wxGTK实现的.wxGTK和wxWidgets的源码打包在一起.wxGTK依赖GTK+,当前版本依赖高于2.8.2的版本.我安装了3.0版本的GTK+.apt-get install gtk+-3.0-dev.一般开发用的库,都有个-dev结尾,这是个约定.开发用的库包含了头文件和文档之类的东西. 为了让不同平台wxWidgets编译之后放到各自的文件夹下,先在解压得到的文件夹下创建一

在Ubuntu下配置舒服的Python开发环境

Ubuntu 提供了一个良好的 Python 开发环境,但如果想使我们的开发效率最大化,还需要进行很多定制化的安装和配置.下面的是我们团队开发人员推荐的一个安装和配置步骤,基于 Ubuntu 12.04 桌面版本标准安装. 安装 Python 发布版本和 build 依赖包 建议至少安装 Python 2.7/3.2 版本,毕竟 Python 2.X/3.X 还是有不少区别的. 1 2 3 4 # 安装 Python 发布版本,dev包必须安装,很多用pip安装包都需要编译 sudo apt-g