如何在Unix下使用Makefile编译程序

makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、

功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整

个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile 中指令的命令工具。

编译原理

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

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。对于后者,通常是你需要告诉编译器头文件的所在位置,只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。

链接时,主要是链接函数和全局变量,所以,我们可以使用这些中间目标文件(O文件或是OBJ文件)来链接我们的应用程序。链接器并不管函数所在的源文件,只管函数的中间目标文件(Object File),在大多数时候,由于源文件太多,编译生成的中间目标文件太多,而在链接时需要明显地指出中间目标文件名,这对于编译很不方便,所以,我们要给中间目标文件打个包,在Windows 下这种包叫“库文件”(LibraryFile),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。

总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而在链接程序时,链接器会在所有的ObjectFile中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error),在VC下,这种错误一般是:Link 2001错误,意思说是说,链接器未能找到函数的实现。你需要指定函数的Object File.

Makefile 介绍

make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和

链接程序。

书写规则:

1)如果这个工程没有编译过,那么我们的所有C文件都要编译并被链接。

2)如果这个工程的某几个C文件被修改,那么我们只编译被修改的C文件,并链接

目标程序。

3)如果这个工程的头文件被改变了,那么我们需要编译引用了这几个头文件的C文件,

并链接目标程序。

Makefile规则:

target ... : prerequisites ...

command

...

target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标

签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。

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

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

这是一个文件的依赖关系,也就是说,target 这一个或多个的目标文件依赖于

prerequisites中的文件,其生成规则定义在command中。说白一点就是说,prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

这就是Makefile的规则。也就是Makefile中最核心的内容。

示例:

# Link:

edit : main.o kbd.o command.o display.o

cc -o edit main.o kbd.o command.o display.o

#compile main.o

main.o : main.c defs.h

cc -c main.c

#compile kbd.o

kbd.o : kbd.c defs.h command.h

cc -c kbd.c

#compile command.o

command.o : command.c defs.h command.h

cc -c command.c

#compile display.o

display.o : display.c defs.h buffer.h

cc -c display.c

# clean: make clean

clean :

rm edit main.o kbd.o command.o display.o

时间: 2024-09-20 01:09:03

如何在Unix下使用Makefile编译程序的相关文章

如何在Unix下使用find命令

例如我们知道一个Linux文件大小为1,500 bytes,那么我们可是使用如下命令来查询 find / -size 1500c,字符 c 表明这个要查的文件的大小是以bytes为单位. 如果我们连这个文件的具体大小都不知道,那么在Linux中还可以进行模糊查模式来解决. 例如我们输入find/ -size +10000000c 这个命令,则标明我们指定系统在根目录中查出大于10000000字节的文件并显示出来.命令中的"+"是表示要求系统只列出大于指定大小的文件,而使用"-

如何在Unix下使用sed命令

sed用法:sed 'Command' filename(s) 只显示结果而不修改文件. 1.sed    '2,5d'    file 显示文件file,除去2-5行,但行数超过文件实际行数时不会报错. sed    '/10[1-4]/d'      file 显示文件file,除去包含101-104的行. sed    '2,$d'            file 显示文件,只显示第一行.sed '2,$!d' file则只显示除第一行外的其它行. sed    '/^ *$/d    

如何在UNIX下挂接U盘、移动硬盘、光驱和fat格式的硬盘

挂接移动硬盘: mount -t msdos /dev/da0s1 /mnt mount -t msdos /dev/da1s1 /mnt mount -t msdos /dev/daXsX /mnt X>=0 光驱 mount -t cd9660 /dev/acd0 /mnt mount -t cd9660 /dev/acd1 /mnt 软盘 mount -t msdos /dev/fd0 /mnt 系统硬盘 mount -t fat /dev/da0a1 /d

makefile-如何在同一目录下用Makefile编写出两个独立的程序?

问题描述 如何在同一目录下用Makefile编写出两个独立的程序? 一个目录下有如下文件:common_api.c common_api.h system.h time_server.c time_client.c如何编写Makefile可以编写出独立运行的两个程序time_server和time_client.

Linux/Unix下ODBC的安装、配置与编程

odbc|unix|编程 Linux/Unix下ODBC的安装.配置与编程 齐亮 (cavendish@eyou.com) 2002 年 7 月 本文主要内容是介绍ODBC的简单原理,以及如何在Linux/Unix下进行ODBC的安装.配置与编程. 一. ODBC原理 ODBC 是Open Database Connect 即开放数据库互连的简称,它是由Microsoft 公司于1991 年提出的一个用于访问数据库的统一界面标准,是应用程序和数据库系统之间的中间件.它通过使用相应应用平台上和所需

[译] 如何在 ChromeOS 下用 Go 搭建 Web 服务

本文讲的是[译] 如何在 ChromeOS 下用 Go 搭建 Web 服务, 原文地址:How I built a web server using Go - and on ChromeOS 原文作者:Peter GleesonFollow 译文出自:掘金翻译计划 译者:xiaoyusilen 校对者:nicebug,steinliber Linux →ChromeOS →Android →Linux Emulator 有时会有人问我:「你究竟为什么要用 Chromebook 做 Web 开发呢

grep 命令系列:如何在 UNIX 中根据文件内容查找文件

grep 命令系列:如何在 UNIX 中根据文件内容查找文件 为了完成课程作业,我写了很多 C 语言代码并把它们保存为 /home/user/c/*.c 和 *.h.那么在 UNIX shell 窗口中我如何能通过字符串或者单词(例如函数名 main())文件内容来查找文件呢? 你需要用到以下工具: [a] grep 命令 : 输出匹配模式的行. [b] find 命令: 在目录层次中查找文件. 使用 grep 命令根据内容查找文件 输入以下命令: grep 'string' *.txt gre

Linux教程:如何在Linux下进行C++开发?

Linux是一类Unix计算机操作系统的统称,Linux操作系统的内核的名字也是"Linux", 在Linux下进行C++开发,需要注意许多问题,比如:减少不必要的编辑动作,减少编辑的时间. Windows下,开发工具多以集成开发环境IDE的形式展现给最终用户.例如,VS2005集成了编辑器,宏汇编ml,C /C++编译器cl,资源编译器rc,调试器,文档生成工具, nmake.它们以集成方式提供给最终用户,对于初学者而言十分方便. 但是,这种商业模式,直接导致用户可定制性差,不利于自

【实用】如何在windows下快速截图?

如何在windows下快速截图? 快速截图是很多人的需求.截图的工具和方案也很多,但是,这里给出一个通用的,被大众认为最高效的一个解决方案. 我们都知道键盘上有一个"prt sc"也是截图的意思,但这个功能默认不开启(不爽),在其他系统比如unix和mac下都是自由实用的,然而windows下默认不成立.废话不多,这里以win7为例. 1.打开开始按钮,找到所有程序.或者直接搜索. 2.找到附件截图工具,拖拉到桌面任务栏中.如下图所示.这是每个window自带的截图工具,无需下载. 3