- 浏览: 1524432 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (516)
- Java (49)
- Java/Struts 2.0 (25)
- Java/Spring、Spring MVC (11)
- Java/Quartz (3)
- Java/Lucene (6)
- Java/Hibernate (19)
- Java/openJPA (7)
- Java/DWR (7)
- Java/Security、Spring Security/OAuth2 (6)
- Java/Threading (9)
- Java/XML (22)
- java/design pattern (4)
- Android (2)
- JavaScript (46)
- jquery (3)
- DB/MySQL (23)
- DB/Oracle (16)
- PHP (25)
- CSS (20)
- Linux (38)
- C/C++、DLL、Makefile、VC++ (31)
- 正则 (9)
- Eclipse (4)
- 安全、网络等概念 (25)
- 集群 (7)
- 网页 (5)
- 视频\音频 (1)
- HTML (6)
- 计算机数学/算法 (3)
- Virtualbox (1)
- LDAP (2)
- 数据挖掘 (6)
- 工具破解 (1)
- 其他 (13)
- Mail (1)
- 药材 (3)
- 游戏 (2)
- hadoop (13)
- 压力测试 (3)
- 设计模式 (3)
- java/Swing (2)
- 缓存/Memcache (0)
- 缓存/Redis (1)
- OSGI (2)
- OSGI/Gemini (0)
- 文档写作 (0)
- java/Servlet (3)
- MQ/RabbitMQ (2)
- MQ/RocketMQ (0)
- MQ/Kafka (1)
- maven (0)
- SYS/linux (1)
- cache/redis (1)
- DB/Mongodb (2)
- nginx (1)
- postman (1)
- 操作系统/ubuntu (1)
- golang (1)
- dubbo (1)
- 技术管理岗位 (0)
- mybatis-plus (0)
最新评论
-
pgx89112:
大神,请赐我一份这个示例的项目代码吧,万分感谢,1530259 ...
spring的rabbitmq配置 -
string2020:
不使用增强器 怎么弄?
OpenJPA的增强器 -
孟江波:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!4 ...
spring的rabbitmq配置 -
eachgray:
...
spring-data-redis配置事务 -
qljoeli:
学习了,楼主,能否提供一份源代码啊,学习一下,十分感谢!!!1 ...
spring的rabbitmq配置
无论是在
Linux
还是在
Unix
环境中,
make
都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到
make
或
make install
。利用
make
工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用
make
和
makefile
工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。而且如此多的源文件,如果每次都要键入
gcc
命令进行编译的话,那对程序员来说简直就是一场灾难。而
make
工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。因此,有效的利用
make
和
makefile
工具可以大大提高项目开发的效率。同时掌握
make
和
makefile
之后,您也不会再面对着
Linux
下的应用软件手足无措了。
但令人遗憾的是,在许多讲述
Linux
应用的书籍上都没有详细介绍这个功能强大但又非常复杂的编译工具。在这里我就向大家详细介绍一下
make
及其描述文件
makefile
。
Makefile
文件
Make
工具最主要也是最基本的功能就是通过
makefile
文件来描述源程序之间的相互关系并自动维护编译工作。而
makefile
文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。
makefile
文件是许多编译器
--
包括
Windows NT
下的编译器
--
维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改
makefile
文件而已。
在
UNIX
系统中,习惯使用
Makefile
作为
makfile
文件。如果要使用其他文件作为
makefile
,则可利用类似下面的
make
命令选项指定
makefile
文件:
$ make -f Makefile.debug
例如,一个名为
prog
的程序由三个
C
源文件
filea.c
、
fileb.c
和
filec.c
以及库文件
LS
编译生成,这三个文件还分别包含自己的头文件
a.h
、
b.h
和
c.h
。通常情况下,
C
编译器将会输出三个目标文件
filea.o
、
fileb.o
和
filec.o
。假设
filea.c
和
fileb.c
都要声明用到一个名为
defs
的文件,但
filec.c
不用。即在
filea.c
和
fileb.c
里都有这样的声明:
#include "defs"
那么下面的文档就描述了这些文件之间的相互联系
:
---------------------------------------------------------
#It is a example for describing makefile
prog : filea.o fileb.o filec.o
cc filea.o fileb.o filec.o -LS -o prog
filea.o : filea.c a.h defs
cc -c filea.c
fileb.o : fileb.c b.h defs
cc -c fileb.c
filec.o : filec.c c.h
cc -c filec.c
----------------------------------------------------------
这个描述文档就是一个简单的
makefile
文件。
从上面的例子注意到,第一个字符为
#
的行为注释行。第一个非注释行指定
prog
由三个目标文件
filea.o
、
fileb.o
和
filec.o
链接生成。第三行描述了如何从
prog
所依赖的文件建立可执行文件。接下来的
4
、
6
、
8
行分别指定三个目标文件,以及它们所依赖的
.c
和
.h
文件以及
defs
文件。而
5
、
7
、
9
行则指定了如何从目标所依赖的文件建立目标。
当
filea.c
或
a.h
文件在编译之后又被修改,则
make
工具可自动重新编译
filea.o
,如果在前后两次编译之间,
filea.C
和
a.h
均没有被修改,而且
test.o
还存在的话,就没有必要重新编译。这种依赖关系在多源文件的程序编译中尤其重要。通过这种依赖关系的定义,
make
工具可避免许多不必要的编译工作。当然,利用
Shell
脚本也可以达到自动编译的效果,但是,
Shell
脚本将全部编译任何源文件,包括哪些不必要重新编译的源文件,而
make
工具则可根据目标上一次编译的时间和目标所依赖的源文件的更新时间而自动判断应当编译哪个源文件。
Makefile
文件作为一种描述文档一般需要包含以下内容
:
◆
宏定义
◆
源文件之间的相互依赖关系
◆
可执行的命令
Makefile
中允许使用简单的宏指代源文件及其相关编译信息,在
Linux
中也称宏为变量。在引用宏时只需在变量前加
$
符号,但值得注意的是,如果变量名的长度超过一个字符,在引用时就必须加圆括号()。
下面都是有效的宏引用:
$(CFLAGS)
$2
$Z
$(Z)
其中最后两个引用是完全一致的。
需要注意的是一些宏的预定义变量,在
Unix
系统中,
$*
、
$@
、
$?
和
$<
四个特殊宏的值在执行命令的过程中会发生相应的变化,而在
GNU
make
中则定义了更多的预定义变量。关于预定义变量的详细内容,宏定义的使用可以使我们脱离那些冗长乏味的编译选项,为编写
makefile
文件带来很大的方便。
---------------------------------------------------------
# Define a macro for the object files
OBJECTS= filea.o fileb.o filec.o
# Define a macro for the library file
LIBES= -LS
# use macros rewrite makefile
prog: $(OBJECTS)
cc $(OBJECTS) $(LIBES) -o prog
……
---------------------------------------------------------
此时如果执行不带参数的
make
命令,将连接三个目标文件和库文件
LS
;但是如果在
make
命令后带有新的宏定义:
make "LIBES= -LL -LS"
则命令行后面的宏定义将覆盖
makefile
文件中的宏定义。若
LL
也是库文件,此时
make
命令将连接三个目标文件以及两个库文件
LS
和
LL
。
在
Unix
系统中没有对常量
NULL
作出明确的定义,因此我们要定义
NULL
字符串时要使用下述宏定义:
STRINGNAME=
Make
命令
在
make
命令后不仅可以出现宏定义,还可以跟其他命令行参数,这些参数指定了需要编译的目标文件。其标准形式为:
target1 [target2 …]:[:][dependent1 …][;commands][#…]
[(tab) commands][#…]
方括号中间的部分表示可选项。
Targets
和
dependents
当中可以包含字符、数字、句点和
"/"
符号。除了引用,
commands
中不能含有
"#",
也不允许换行。
在通常的情况下命令行参数中只含有一个
":"
,此时
command
序列通常和
makefile
文件中某些定义文件间依赖关系的描述行有关。如果与目标相关连的那些描述行指定了相关的
command
序列,那么就执行这些相关的
command
命令,即使在分号和
(tab)
后面的
aommand
字段甚至有可能是
NULL
。如果那些与目标相关连的行没有指定
command
,那么将调用系统默认的目标文件生成规则。
如果命令行参数中含有两个冒号
"::"
,则此时的
command
序列也许会和
makefile
中所有描述文件依赖关系的行有关。此时将执行那些与目标相关连的描述行所指向的相关命令。同时还将执行
build-in
规则。
如果在执行
command
命令时返回了一个非
"0"
的出错信号,例如
makefile
文件中出现了错误的目标文件名或者出现了以连字符打头的命令字符串,
make
操作一般会就此终止,但如果
make
后带有
"-i"
参数,则
make
将忽略此类出错信号。
Make
命本身可带有四种参数:标志、宏定义、描述文件名和目标文件名。其标准形式为:
Make [flags] [macro definitions] [targets]
Unix
系统下标志位
flags
选项及其含义为:
-f file
指定
file
文件为描述文件,如果
file
参数为
"-"
符,那么描述文件指向标准输入。如果没有
"-f"
参数,则系统将默认当前目录下名为
makefile
或者名为
Makefile
的文件为描述文件。在
Linux
中,
GNU make
工具在当前工作目录中按照
GNUmakefile
、
makefile
、
Makefile
的顺序搜索
makefile
文件。
-i
忽略命令执行返回的出错信息。
-s
沉默模式,在执行之前不输出相应的命令行信息。
-r
禁止使用
build-in
规则。
-n
非执行模式,输出所有执行命令,但并不执行。
-t
更新目标文件。
-q
make
操作将根据目标文件是否已经更新返回
"0"
或非
"0"
的状态信息。
-p
输出所有宏定义和目标文件描述。
-d
Debug
模式,输出有关文件和检测时间的详细信息。
Linux
下
make
标志位的常用选项与
Unix
系统中稍有不同,下面我们只列出了不同部分:
-c dir
在读取
makefile
之前改变到指定的目录
dir
。
-I dir
当包含其他
makefile
文件时,利用该选项指定搜索目录。
发表评论
-
数据结构与算法分析(C语言描述)源代码与答案
2009-12-14 11:44 6714数据结构与算法分析(C语言描述)(第二版) Mark A ... -
A new Michael Jackson song
2009-10-12 16:48 948<!-- [if gte mso 9]><x ... -
makefile 大全
2009-02-24 07:37 1179http://chenl.blogbus.com/logs ... -
C++的11个注意要点
2009-02-24 07:33 1029C++ 的 11 个注意要点 ... -
运用autoconf和automake自动生成Makefile实例讲解
2009-02-24 07:30 4067运用 autoconf 和 automake ... -
makefile详解(6)
2009-02-24 07:23 1783makefile 详解( 6 ) ... -
makefile详解(5)
2009-02-24 07:22 1674<!-- --><!-- -->& ... -
makefile详解(4)
2009-02-24 07:21 1421<!-- --><!-- -->& ... -
makefile详解(3)
2009-02-24 07:20 1636<!-- --><!-- --> & ... -
makefile详解(2)
2009-02-24 07:19 1331<!-- --><!-- --> & ... -
makefile详解(1)
2009-02-24 07:18 1505makefile 详解 ... -
VC++动态链接库(DLL)编程深入浅出(二) Win32 Dynamic-Link Library
2008-08-19 14:23 8023上节给大家介绍了静态链接库与库的调试与查看( 动态链 ... -
VC++动态链接库(DLL)编程深入浅出(一) Win32 Static Library
2008-08-19 14:13 7115http://www.pconline.com.cn/pced ... -
VC++常用数据类型及其操作详解
2008-08-18 23:43 1383http://blog.csdn.net/flxyzsby/a ... -
VC++数据类型转换大全
2008-08-18 23:25 64097int i = 100; long l = 2001; f ... -
DLL导出变量
2008-08-18 16:20 2071DLL定义的全局变量可以被调用进程访问;DLL也可以访问调用进 ... -
DLL导出类
2008-08-18 16:20 2627DLL中定义的类可以在应用工程中使用。 下面的例子里,我 ... -
MFC规则DLL 概述
2008-08-18 16:19 2820MFC规则DLL的概念体现在两方面: (1) 它是MFC ... -
MFC规则DLL的创建
2008-08-18 16:18 1852我们来一步步讲述使用MFC向导创建MFC规则DLL的过程,首先 ... -
MFC规则DLL 简单的例子
2008-08-18 16:16 3959这个DLL的例子(属于静态链接到MFC 的规则DLL)中提供了 ...
相关推荐
在Linux和Unix环境中,`make`和`makefile`是两个关键工具,它们极大地提高了软件构建和维护的效率。本文将深入探讨这两个概念及其应用场景。 `make`是一个自动化构建工具,它根据`makefile`中的规则来编译、链接源...
总结一下,`make`和`makefile`在Linux和Unix环境下提供了高效、自动化的构建流程,无论对于单个程序还是大规模的软件项目,它们都是不可或缺的工具。通过编写清晰、有效的`makefile`,开发者可以轻松地控制项目的...
无论是在Linux还是在Unix环境中,make都是个非常重要的编译命令。不管是自己进行项目研发还是安装应用软件,我们都经常要用到make或make ...同时掌控make和makefile之后,你也不会再面对着Linux下的应用软件手足无措了
Linux&Unix环境下的make和makefile详解 (文章来自cu 原作者xzh2002).doc
### Linux/Unix环境下的Make和Makefile详解 #### 一、Make工具简介 在Linux或Unix环境下,Make是一个极其重要的工具,广泛应用于项目开发和软件安装过程中。它可以帮助开发者高效地管理和编译复杂的项目,尤其是当...
在Linux和Unix环境下,`make`与`makefile`是构建和管理软件项目的重要工具,它们简化了编译过程,确保代码的正确性和更新效率。本文将深入解析这两个概念的关键知识点,帮助读者更好地理解并应用到实际开发环境中。 ...
### Linux/Unix环境下的Make和Makefile详解 在Linux或Unix环境下进行软件开发时,`Make` 和 `Makefile` 是两个极其重要的概念。本文旨在深入解析这些工具的基本原理及其实现方法,以便读者能够更好地理解和掌握如何...
Linux&Unix环境下的make和makefile详解 (文章来自cu 原作者xzh2002)new.doc
在 Unix/Linux 环境下,Makefile 的使用更为普遍和必要。由于没有集成开发环境(IDE)提供的图形化界面支持,编写 Makefile 成为了软件构建流程中不可或缺的一环。尤其是面对大型工程,Makefile 的编写能力直接体现...
在Linux和Unix环境下,`make`命令是一种自动化构建工具,用于编译源代码并管理项目的构建过程。它基于一个名为Makefile(或makefile)的文件来执行一系列预定义的任务,如编译、链接和安装软件包。Makefile是make...
不仅如此,跨平台的兼容性使得`make`成为了一个通用的构建工具,不仅在Linux和Unix环境下广泛使用,还可以在Windows NT下通过相应的编译器支持`makefile`。 总之,`make`和`makefile`是软件开发中的强大工具,它们...
Make和Makefile是软件构建过程中的重要工具,主要用于自动化编译和链接过程,尤其是在Linux和Unix环境下。Make命令是基于Makefile文件运行的,它能够根据文件间的依赖关系,智能地决定哪些源文件需要重新编译,从而...
`make`和`makefile`是Linux和Unix环境下常用的自动化构建工具,它们可以帮助开发者高效地编译、链接和管理软件项目。本文将深入探讨这两个概念,以及如何利用它们来优化开发流程。 首先,`make`是一个命令行工具,...
Makefile是Unix/Linux系统中用于控制软件编译过程的脚本文件,它记录了项目中源文件之间的依赖关系,并规定了如何进行编译和链接,以生成可执行文件。Makefile广泛应用于C和C++的项目中,因为它可以大大简化编译过程...
### Linux Makefile 教程详解 #### 一、Makefile 概述与基本概念 Makefile 是一种在 Unix/Linux 系统中用于自动化构建过程的脚本文件,它基于依赖关系来编译和链接源代码文件,从而创建可执行程序或库。Makefile ...