Makefile详解——从⼊门到精通写的相当不错很详细,只是有点多,当作⼀个参考⼿册⾮常不错,所以转过来,顺便整理⼀下。
make命令
make -h 帮助。更详细帮助可以查看 man make
root@kali:~# make -h
Usage: make [options] [target] ...
Options:
-b, -m Ignored for compatibility.
-B, --always-make Unconditionally make all targets.
-C DIRECTORY, --directory=DIRECTORY
Change to DIRECTORY before doing anything.
-d Print lots of debugging information.
--debug[=FLAGS] Print various types of debugging information.
-
e, --environment-overrides
Environment variables override makefiles.
--eval=STRING Evaluate STRING as a makefile statement.
-f FILE, --file=FILE, --makefile=FILE
Read FILE as a makefile.
-h, --help Print this message and exit.
-i, --ignore-errors Ignore errors from recipes.
-I DIRECTORY, --include-dir=DIRECTORY
Search DIRECTORY for included makefiles.
-j [N], --jobs[=N] Allow N jobs at once; infinite jobs with no arg.
-k, --keep-going Keep going when some targets can't be made.
-
l [N], --load-average[=N], --max-load[=N]
Don't start multiple jobs unless load is below N.
-L, --check-symlink-times Use the latest mtime between symlinks and target.
-n, --just-print, --dry-run, --recon
Don't actually run any recipe; just print them.
-o FILE, --old-file=FILE, --assume-old=FILE
Consider FILE to be very old and don't remake it.
-O[TYPE], --output-sync[=TYPE]
Synchronize output of parallel jobs by TYPE.
-p, --print-data-base Print make's internal database.
-q, --question Run no recipe; exit status says if up to date.
-
r, --no-builtin-rules Disable the built-in implicit rules.
-R, --no-builtin-variables Disable the built-in variable settings.
-s, --silent, --quiet Don't echo recipes.
-S, --no-keep-going, --stop
Turns off -k.
-t, --touch Touch targets instead of remaking them.
--trace Print tracing information.
-v, --version Print the version number of make and exit.
-w, --print-directory Print the current directory.
--no-print-directory Turn off -w, even if it was turned on implicitly.
-W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE
Consider FILE to be infinitely new.
--warn-undefined-variables Warn when an undefined variable is referenced.
make 命令格式:make [-f Makefile] [option] [target]
make 是⼀个解释 makefile 中指令的命令⼯具。make ⼯具最主要也是最基本的功能:就是通过 makefile⽂件 来描述源程序之间的相互关系并⾃动维护编译⼯作。⽽ makefile⽂件 需要按照某种语法进⾏编写,⽂件中需要说明如何编译各个源⽂件,并连接⽣成可执⾏⽂件,并要求定义源⽂件之间的依赖关系。
编译⼯具make、gmake、cmake、nmake和Dmake的区别
1. gamke, make, nmake, dmake, cmake 异同
--------------------------------------------------------------------
Dmake是同GNU Make类似的⼀个⼯具。其命令格式⾃成⼀体,但是可以适⽤于Linux, Solaris, and Win32 and other platforms。Dmake有⼀个变种,被使⽤。dmake 是⼀个命令⾏⼯具,与 make(1) 兼容。dmake 能够以⽹格、分布、并⾏或串⾏模式⽣成⽬标。如果使⽤的是标准 mak
e(1) 实⽤程序,在对 makefile 进⾏任何更改时可以毫不费⼒地过渡到使⽤ dmake。dmake 是 make 实⽤程序的超集。
跨平台的编译⼯具,其中最有名的两个是 cmake 和 scons,cmake 之所以出名估计是因为 KDE 4 从 autotools 转向⽤ cmake 来编译。⽽ scons 则是 lighttpd 原来⽤的编译⼯具,它现在也转向 Python 了。
cmake 和 python ⼤概代表了新⼀代跨平台编译⼯具的两种⽅向。第⼀种 (cmake) 是延续并改良传统 automake, autoconf ⼯具链,将之合为⼀体,但最终仍然⽣成 Makefile, Visual Studio 的 .sln,Xcode 的 .xcodebuild ⽂件,依赖现有编译⼯具 (make, nmake, vcbuild, xcodebuild) 来编译;第⼆种则是完全消除现有编译⼯具的调⽤,直接调⽤编译器,scons 就属于这⼀类 (scons 还有⼀个特点是完全不⽤专门的语⾔,控制编译的脚本就是 Python)。
从⼈⽓上 来说,反倒是⾛改良路线的 cmake ⽐ scons 好⼀些,有⼏个原因:scons 基于 Python,可能有些代码不是很照顾速度,于是类似 KDE 这样的⼤项⽬编译起来会很慢;scons 开发⽐较慢,最近⼀直只是 bugfix。不过相对 cmake,scons 的优点是⽂档⾮常细致可读,⽽ cmake 的⽂档则⾮常少,可以在⽹上到的只有⼏篇介绍性的⽂章和参考⼿册,不像 scons 有⼀本 User Guide。
与之相关的⼯具还有 Jam (包括它的变体 FTJam, Boost.Build), Waf, Bakefile 等。其中⽐较新的 Waf
是⼀个 scons 的改进,在它的提供的 benchmark 中,显⽰通过缓存⽅式可以⼤⼤改进编译的速度。不过因为这个项⽬还很新,⽬前没有什么软件⽤它作为编译系统。 Bakefile ⾛的则是 cmake 的路⼦,从名称上也可以看出,它最终也是通过⽣成 Makefile ⼀类的⽂件来完成编译的。不过不同的地⽅在于 cmake ⽤的语法很像 autotools ⽤的 m4 的传统语法,⽽ bakefile 则完全⽤ XML 来定义编译规则了,这⼀点倒很像 ant。Bakefile 倒是有不少著名的项⽬使⽤,⽐如 wxWidgets, WebKit, VCF, libxml。
2. 交叉编译器制作流程
⼤家都知道,写程序⼤体步骤为:
1.⽤编辑器编写源代码,如.c⽂件。
2.⽤编译器编译代码⽣成⽬标⽂件,如.o。
3.⽤链接器连接⽬标代码⽣成可执⾏⽂件,如.exe。
但如果源⽂件太多,⼀个⼀个编译时就会特别⿇烦,于是⼈们想到,为什么不设计⼀种类似批处理的
程序,来批处理编译源⽂件呢,于是就有了make⼯具,它是⼀个⾃动化编译⼯具,你可以使⽤⼀条命令实现完全编译。但是你需要编写⼀个规则⽂件,make依据它来批处理编译,这个⽂件就是makefile,所以编写makefile⽂件也是⼀个程序员所必备的技能。
对于⼀个⼤⼯程,编写makefile实在是件复杂的事,于是⼈们⼜想,为什么不设计⼀个⼯具,读⼊所有源⽂件之后,⾃动⽣成makefile呢,于是就出现了cmake⼯具,它能够输出各种各样的makefile或者project⽂件,从⽽帮助程序员减轻负担。但是随之⽽来也就是编写cmakelist⽂件,它是cmake所依据的规则。所以在编程的世界⾥没有捷径可⾛,还是要脚踏实地的。
概述xcode入门
什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个⼯作,但我觉得要作⼀个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为⼀个专业⼈⼠,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不⾃⼰写makefile了,会不会写makefile,从⼀个侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒。
因为,makefile关系到了整个⼯程的编译规则。⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要
后编译,哪些⽂件需要重新编译,甚⾄于进⾏更复杂的功能操作,因为makefile就像⼀个Shell脚本⼀样,其中也可以执⾏操作系统的命令。
makefile带来的好处就是——“⾃动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全⾃动编译,极⼤的提⾼了软件开发的效率。make是⼀个命令⼯具,是⼀个解释makefile中指令的命令⼯具,⼀般来说,⼤多数的IDE都有这个命令,⽐如:Delphi的
make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了⼀种在⼯程⽅⾯的编译⽅法。现在讲述如何写makefile的⽂章⽐较少,这是我想写这篇⽂章的原因。当然,不同产商的make各不相同,也有不同的语法,但其本质都是在“⽂件依赖性”上做⽂章,这⾥,我仅对GNU的make进⾏讲述,我的环境是RedHat Linux 8.0,make的版本是3.80。必竟,这个make是应⽤最为⼴泛的,也是⽤得最多的。⽽且其还是最遵循于IEEE 1003.2-1992 标准的(POSIX.2)。在这篇⽂档中,将以C/C++的源码作为我们基础,所以必然涉及⼀些关于C/C++的编译的知识,相关于这⽅⾯的内容,还请各位查看相关的编译器的⽂档。这⾥所默认的编译器是UNIX下的GCC和CC。
程序的编译和链接
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论