请选择 进入手机版 | 继续访问电脑版

[LINUX] Linux 下 Make 下令 实例详解

[复制链接]
查看62 | 回复13 | 2021-9-5 02:57:27 | 显示全部楼层 |阅读模式

Linux 下 make 下令 是体系 管理员和程序员用的最频仍 的下令 之一。管理员用它通过下令 行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译标题 。本文我们将用一些实例来讨论 make 下令 背后的工作机制。

Make 怎样 工作的

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

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

如今 ,假设你对某个源文件举行 了修改,你再次实行 make 下令 ,它将只编译与该源文件干系 的目标 文件,因此,编译完终极 的可实行 文件节流 了大量的时间。

Make 下令 实例

下面是本文所使用 的测试环境:

  1. OS —— Ubunut 13.04
  2. Shell —— Bash 4.2.45
  3. Application —— GNU Make 3.81
复制代码

下面是工程的内容:

  1. $ ls
  2. anotherTest.c Makefile test.c test.h
复制代码

下面是 Makefile 的内容:

  1. all: test
  2. test: test.o anotherTest.o
  3. gcc -Wall test.o anotherTest.o -o test
  4. test.o: test.c
  5. gcc -c -Wall test.c
  6. anotherTest.o: anotherTest.c
  7. gcc -c -Wall anotherTest.c
  8. clean:
  9. rm -rf *.o test
复制代码

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

1. 一个简单的例子

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

  1. $ make
  2. gcc -c -Wall test.c
  3. gcc -c -Wall anotherTest.c
  4. gcc -Wall test.o anotherTest.o -o test
复制代码

你能看到 make 下令 第一次创建的依靠 以及实际 的目标 。

假如 你再次查看目次 内容,内里 多了一些 .o 文件和实行 文件:

  1. $ ls
  2. anotherTest.c anotherTest.o Makefile test test.c test.h test.o
复制代码

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

  1. $ make
  2. gcc -c -Wall test.c
  3. gcc -Wall test.o anotherTest.o -o test
复制代码

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

如今 清算 全部 的目标 文件和可实行 文件 test,你可以使用 目标 clean:

  1. $ make clean
  2. rm -rf *.o test
  3. $ ls
  4. anotherTest.c Makefile test.c test.h
复制代码

你可以看到全部 的 .o 文件和实行 文件 test 都被删除了。

2. 通过 -B 选项让全部 目标 总是重新建立

到如今 为止,你大概 注意 到 make 下令 不会编译那些自从前次 编译之后就没有更改的文件,但是,假如 你想覆盖 make 这种默认的举动 ,你可以使用 -B 选项。

下面是个例子:

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

你可以看到只管 make 下令 不会编译任何文件,然而 make -B 会逼迫 编译全部 的目标 文件以及终极 的实行 文件。

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

假如 你想知道 make 实行 时实际 做了什么,使用 -d 选项。

这是一个例子:

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

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

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

你可以为 make 下令 提供不同的目次 路径,在探求 Makefile 之前会切换目次 的。

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

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

但是你想运行的 make 下令 的 Makefile 文件保存在 ../make-dir/ 目次 下,你可以如许 做:

  1. $ make -C ../make-dir/
  2. make: Entering directory `/home/himanshu/practice/make-dir’
  3. make: Nothing to be done for `all’.
  4. 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。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 淡淡如菊795 | 2021-9-19 07:00:52 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的源码论坛他的站点都是商业源码,还是免费下载的那种!特别好用。访问地址:http://www.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 毛当归搜 | 2021-9-22 16:16:32 | 显示全部楼层
admin楼主的帖子提神醒脑啊!
回复

使用道具 举报

avatar 群主713 | 2021-9-24 18:12:41 | 显示全部楼层
太邪乎了吧?
回复

使用道具 举报

avatar 樱花283 | 2021-10-8 16:16:25 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,他卖的服务器是永久的,我们的网站用 服务器都是在这家买的,你可以去试试。访问地址:http://fwq.mxswl.com
回复

使用道具 举报

avatar 大龙山草 | 2021-10-9 03:42:37 | 显示全部楼层
知识就是力量啊!
回复

使用道具 举报

avatar 屎壳郎秧 | 2021-10-10 07:54:47 | 显示全部楼层
楼上的这是啥态度呢?
回复

使用道具 举报

avatar 红军利物浦2017 | 2021-10-11 15:46:59 | 显示全部楼层
admin楼主英明!
回复

使用道具 举报

avatar 巴拿巴 | 2021-10-15 21:11:58 | 显示全部楼层
我和我的小伙伴都惊呆了!
回复

使用道具 举报

没人理我,好伤心啊!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则