<fieldset id='hanmp'></fieldset>
<acronym id='hanmp'><em id='hanmp'></em><td id='hanmp'><div id='hanmp'></div></td></acronym><address id='hanmp'><big id='hanmp'><big id='hanmp'></big><legend id='hanmp'></legend></big></address>
  • <ins id='hanmp'></ins>

      <span id='hanmp'></span>
    1. <tr id='hanmp'><strong id='hanmp'></strong><small id='hanmp'></small><button id='hanmp'></button><li id='hanmp'><noscript id='hanmp'><big id='hanmp'></big><dt id='hanmp'></dt></noscript></li></tr><ol id='hanmp'><table id='hanmp'><blockquote id='hanmp'><tbody id='hanmp'></tbody></blockquote></table></ol><u id='hanmp'></u><kbd id='hanmp'><kbd id='hanmp'></kbd></kbd>

      <code id='hanmp'><strong id='hanmp'></strong></code>
      <dl id='hanmp'></dl>
      <i id='hanmp'><div id='hanmp'><ins id='hanmp'></ins></div></i>

          <i id='hanmp'></i>

            Linux 下 Make 命令实例详解

            • 时间:
            • 浏览:8
            • 来源:124软件资讯网

                Linux 下 Make 下令实例详解

              Linux 下 make 下令是系统治理员和法式员用的最频仍的下令之一  。治理员用它通过下令行来编译和安装许多开源的工具  ,法式员用它来治理他们大型庞大的项目编译问题  。本文我们将用一些实例来讨论 make 下令背后的事情机制  。

                Make 怎样事情的

                对于不知道背后机理的人来说  ,make 下令像下令行参数一样吸收目的  。这些目的通常存放在以 “Makefile” 来命名的特殊文件中 ,同时文件也包罗与目的相对应的操作 。更多信息  ,阅读关于 Makefiles 怎样事情的系列文章  。服务器教程

                当 make 下令第一次执行时  ,它扫描 Makefile 找到目的以及其依赖  。若是这些依赖自身也是目的  ,继续为这些依赖扫描 Makefile 建设其依赖关系  ,然后编译它们  。一旦主依赖编译之后 ,然后就编译主目的(这是通过 make 下令传入的)  。

                现在  ,假设你对某个源文件举行了修改  ,你再次执行 make 下令  ,它将只编译与该源文件相关的目的文件  ,因此  ,编译完最终的可执行文件节约了大量的时间 。

                Make 下令实例

                下面是本文所使用的测试情况:

                ?

              1 2 3 OS —— Ubunut 13.04 Shell —— Bash 4.2.45 Application —— GNU Make 3.81

                下面是工程的内容:

                ?

              1 2 $ ls anotherTest.c Makefile test.c test.h

                下面是 Makefile 的内容:

                ?

              1 2 3 4 5 6 7 8 9 10 11 12 13 all: test test: test.o anotherTest.o gcc -Wall test.o anotherTest.o -o test test.o: test.c gcc -c -Wall test.c anotherTest.o: anotherTest.c gcc -c -Wall anotherTest.c clean: rm -rf *.o test

                现在我们来看 Linux 下一些 make 下令应用的实例:

                1. 一个简朴的例子

                为了编译整个工程  ,你可以简朴的使用 make 或者在 make 下令后带上目的 all  。

                ?

              1 2 3 4 $ make gcc -c -Wall test.c gcc -c -Wall anotherTest.c gcc -Wall test.o anotherTest.o -o test

                你能看到 make 下令第一次建立的依赖以及现实的目的 。

                若是你再次检察目录内容  ,内里多了一些 .o 文件和执行文件:

                ?

              1 2 $ ls anotherTest.c anotherTest.o Makefile test test.c test.h test.o

                现在  ,假设你对 test.c 文件做了一些修改 ,重新使用 make 编译工程:

                ?

              1 2 3 $ make gcc -c -Wall test.c gcc -Wall test.o anotherTest.o -o test

                你可以看到只有 test.o 重新编译了  ,然而另一个 Test.o 没有重新编译  。

                现在清算所有的目的文件和可执行文件 test  ,你可以使用目的 clean:

                ?

              1 2 3 4 5 $ make clean rm -rf *.o test $ ls anotherTest.c Makefile test.c test.h

                你可以看到所有的 .o 文件和执行文件 test 都被删除了 。

                2. 通过 -B 选项让所有目的总是重新建设

                到现在为止 ,你可能注重到 make 下令不会编译那些自从上次编译之后就没有更改的文件  ,可是  ,若是你想笼罩 make 这种默认的行为  ,你可以使用 -B 选项  。

                下面是个例子:

                ?

              1 2 3 4 5 6 7 $ make make: Nothing to be done for `all’. $ make -B gcc -c -Wall test.c gcc -c -Wall anotherTest.c gcc -Wall test.o anotherTest.o -o test

                你可以看到只管 make 下令不会编译任何文件  ,然而 make -B 会强制编译所有的目的文件以及最终的执行文件 。

                3. 使用 -d 选项打印调试信息

                若是你想知道 make 执行时现实做了什么  ,使用 -d 选项  。

                这是一个例子:

                ?

              1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 $ make -d | more GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for x86_64-pc-linux-gnu Reading makefiles… Reading makefile `Makefile’… Updating makefiles…. Considering target file `Makefile’. Looking for an implicit rule for `Makefile’. Trying pattern rule with stem `Makefile’. Trying implicit prerequisite `Makefile.o’. Trying pattern rule with stem `Makefile’. Trying implicit prerequisite `Makefile.c’. Trying pattern rule with stem `Makefile’. Trying implicit prerequisite `Makefile.cc’. Trying pattern rule with stem `Makefile’. Trying implicit prerequisite `Makefile.C’. Trying pattern rule with stem `Makefile’. Trying implicit prerequisite `Makefile.cpp’. Trying pattern rule with stem `Makefile’. --More--

                这是很长的输出  ,你也看到我使用了 more 下令来一页一页显示输出  。

                4. 使用 -C 选项改变目录

                你可以为 make 下令提供差别的目录路径  ,在寻找 Makefile 之前会切换目录的  。

                这是一个目录  ,假设你就在当前目录下:

                ?

              1 2 3 $ ls file file2 frnd frnd1.cpp log1.txt log3.txt log5.txt file1 file name with spaces frnd1 frnd.cpp log2.txt log4.txt

                可是你想运行的 make 下令的 Makefile 文件生存在 ../make-dir/ 目录下  ,你可以这样做:

                ?

              1 2 3 4 $ make -C ../make-dir/ make: Entering directory `/home/himanshu/practice/make-dir’ make: Nothing to be done for `all’. make: Leaving directory `/home/himanshu/practice/make-dir

                你能看到 make 下令首先切到特定的目录下  ,在那执行  ,然后再切换回来 。

                5. 通过 -f 选项将其它文件看作 Makefile

                若是你想将重命名 Makefile 文件  ,好比取名为 my_makefile 或者其它的名字  ,我们想让 make 将它也当成 Makefile  ,可以使用 -f 选项 。

                ?

              1 make -f my_makefile

                通过这种要领  ,make 下令会选择扫描 my_makefile 来取代 Makefile  。