- 浏览: 599376 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
在本章一开始我们提到过 make 的功能是可以简化编译过程里面所下达的命令,同时还具有很多很方便的功能!那么底下咱们就来试看看使用 make 简化下达编译命令的流程吧!
为什么要用 make
先来想像一个案例,假设我的运行档里面包含了四个原始码文件,分别是 main.c haha.c sin_value.c cos_value.c 这四个文件,这四个文件的目的是:
main.c :主要的目的是让使用者输入角度数据与呼叫其他三支副程序;
haha.c :输出一堆有的没有的信息而已;
sin_value.c :计算使用者输入的角度(360) sin 数值;
cos_value.c :计算使用者输入的角度(360) cos 数值。
这四个文件你可以到 http://vbird.dic.ksu.edu.tw/linux_basic/0520source/main.tgz 来下载。由於这四个文件里面包含了相关性,并且还用到数学函式在里面,所以如果你想要让这个程序可以跑, 那么就需要这样编译:
编译的过程需要进行好多动作啊!而且如果要重新编译,则上述的流程得要重新来一遍,光是找出这些命令就够烦人的了! 如果可以的话,能不能一个步骤就给他完成上面所有的动作呢?那就利用 make 这个工具吧! 先试看看在这个目录下创建一个名为 makefile 的文件,内容如下:
或许你会说:『如果我创建一个 shell script 来将上面的所有动作都集结在一起,不是具有同样的效果吗?』呵呵! 效果当然不一样,以上面的测试为例,我们仅写出 main 需要的目标档,结果 make 会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连结的动作! 真的是很方便啊!此外,如果我们更动过某些原始码文件,则 make 也可以主动的判断哪一个原始码与相关的目标档文件有升级过, 并仅升级该文件,如此一来,将可大大的节省很多编译的时间呢!要知道,某些程序在进行编译的行为时,会消耗很多的 CPU 资源呢!所以说, make 有这些好处:
简化编译时所需要下达的命令;
若在编译完成之后,修改了某个原始码文件,则 make 仅会针对被修改了的文件进行编译,其他的 object file 不会被更动;
最后可以依照相依性来升级 (update) 运行档。
既然 make 有这么多的优点,那么我们当然就得好好的了解一下 make 这个令人关心的家伙啦!而 make 里面最需要注意的大概就是那个守则文件,也就是 makefile 这个文件的语法啦!所以底下我们就针对 makefile 的语法来加以介绍罗。
makefile 的基本语法与变量
make 的语法可是相当的多而复杂的,有兴趣的话可以到 GNU (注1) 去查阅相关的说明,鸟哥这里仅列出一些基本的守则,重点在於让读者们未来在接触原始码时,不会太紧张啊! 好了,基本的 makefile 守则是这样的:
那个标的 (target) 就是我们想要创建的资讯,而目标档就是具有相关性的 object files ,那创建运行档的语法就是以 <tab> 按键开头的那一行!特别给他留意喔,『命令列必须要以 tab 按键作为开头』才行!他的守则基本上是这样的:
在 makefile 当中的 # 代表注解;
<tab> 需要在命令行 (例如 gcc 这个编译器命令) 的第一个字节;
标的 (target) 与相依文件(就是目标档)之间需以『:』隔开。
同样的,我们以刚刚上一个小节的范例进一步说明,如果我想要有两个以上的运行动作时, 例如下达一个命令就直接清除掉所有的目标档与运行档,该如何制作呢?
如此一来,我们的 makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可啊!而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』,如下所示:
这样就很清楚了吧!但是,你是否会觉得,咦! makefile 里面怎么重复的数据这么多啊!没错!所以我们可以再藉由 shell script 那时学到的『变量』来更简化 makefile 喔:
与 bash shell script 的语法有点不太相同,变量的基本语法为:
变量与变量内容以『=』隔开,同时两边可以具有空格;
变量左边不可以有 <tab> ,例如上面范例的第一行 LIBS 左边不可以是 <tab>;
变量与变量内容在『=』两边不能具有『:』;
在习惯上,变量最好是以『大写字母』为主;
运用变量时,以 ${变量} 或 $(变量) 使用;
在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
在命令列模式也可以给予变量。
由於 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里面去定义,更可以在命令列当中给予这个咚咚呢!例如:
咦!我可以利用命令列进行环境变量的输入,也可以在文件内直接指定环境变量,那万一这个 CFLAGS 的内容在命令列与 makefile 里面并不相同时,以那个方式输入的为主?呵呵!问了个好问题啊! 环境变量取用的守则是这样的:
make 命令列后面加上的环境变量为优先;
makefile 里面指定的环境变量第二;
shell 原本具有的环境变量第三。
此外,还有一些特殊的变量需要了解的喔:
$@:代表目前的标的(target)
所以我也可以将 makefile 改成:
转自:http://vbird.dic.ksu.edu.tw/linux_basic/0520source_code_and_tarball_3.php
为什么要用 make
先来想像一个案例,假设我的运行档里面包含了四个原始码文件,分别是 main.c haha.c sin_value.c cos_value.c 这四个文件,这四个文件的目的是:
main.c :主要的目的是让使用者输入角度数据与呼叫其他三支副程序;
haha.c :输出一堆有的没有的信息而已;
sin_value.c :计算使用者输入的角度(360) sin 数值;
cos_value.c :计算使用者输入的角度(360) cos 数值。
这四个文件你可以到 http://vbird.dic.ksu.edu.tw/linux_basic/0520source/main.tgz 来下载。由於这四个文件里面包含了相关性,并且还用到数学函式在里面,所以如果你想要让这个程序可以跑, 那么就需要这样编译:
# 1. 先进行目标档的编译,最终会有四个 *.o 的档名出现: [root@www ~]# gcc -c main.c [root@www ~]# gcc -c haha.c [root@www ~]# gcc -c sin_value.c [root@www ~]# gcc -c cos_value.c # 2. 再进行连结成为运行档,并加入 libm 的数学函式,以产生 main 运行档: [root@www ~]# gcc -o main main.o haha.o sin_value.o cos_value.o \ > -lm -L/usr/lib -L/lib # 3. 本程序的运行结果,必须输入姓名、360 度角的角度值来计算: [root@www ~]# ./main Please input your name: VBird <==这里先输入名字 Please enter the degree angle (ex> 90): 30 <==输入以 360 度角为主的角度 Hi, Dear VBird, nice to meet you. <==这三行为输出的结果喔! The Sin is: 0.50 The Cos is: 0.87
编译的过程需要进行好多动作啊!而且如果要重新编译,则上述的流程得要重新来一遍,光是找出这些命令就够烦人的了! 如果可以的话,能不能一个步骤就给他完成上面所有的动作呢?那就利用 make 这个工具吧! 先试看看在这个目录下创建一个名为 makefile 的文件,内容如下:
# 1. 先编辑 makefile 这个守则档,内容只要作出 main 这个运行档 [root@www ~]# vim makefile main: main.o haha.o sin_value.o cos_value.o gcc -o main main.o haha.o sin_value.o cos_value.o -lm # 注意:第二行的 gcc 之前是 <tab> 按键产生的空格喔! # 2. 尝试使用 makefile 制订的守则进行编译的行为: [root@www ~]# rm -f main *.o <==先将之前的目标档去除 [root@www ~]# make cc -c -o main.o main.c cc -c -o haha.o haha.c cc -c -o sin_value.o sin_value.c cc -c -o cos_value.o cos_value.c gcc -o main main.o haha.o sin_value.o cos_value.o -lm # 此时 make 会去读取 makefile 的内容,并根据内容直接去给他编译相关的文件罗! # 3. 在不删除任何文件的情况下,重新运行一次编译的动作: [root@www ~]# make make: `main' is up to date. # 看到了吧!是否很方便呢!只会进行升级 (update) 的动作而已。
或许你会说:『如果我创建一个 shell script 来将上面的所有动作都集结在一起,不是具有同样的效果吗?』呵呵! 效果当然不一样,以上面的测试为例,我们仅写出 main 需要的目标档,结果 make 会主动的去判断每个目标档相关的原始码文件,并直接予以编译,最后再直接进行连结的动作! 真的是很方便啊!此外,如果我们更动过某些原始码文件,则 make 也可以主动的判断哪一个原始码与相关的目标档文件有升级过, 并仅升级该文件,如此一来,将可大大的节省很多编译的时间呢!要知道,某些程序在进行编译的行为时,会消耗很多的 CPU 资源呢!所以说, make 有这些好处:
简化编译时所需要下达的命令;
若在编译完成之后,修改了某个原始码文件,则 make 仅会针对被修改了的文件进行编译,其他的 object file 不会被更动;
最后可以依照相依性来升级 (update) 运行档。
既然 make 有这么多的优点,那么我们当然就得好好的了解一下 make 这个令人关心的家伙啦!而 make 里面最需要注意的大概就是那个守则文件,也就是 makefile 这个文件的语法啦!所以底下我们就针对 makefile 的语法来加以介绍罗。
makefile 的基本语法与变量
make 的语法可是相当的多而复杂的,有兴趣的话可以到 GNU (注1) 去查阅相关的说明,鸟哥这里仅列出一些基本的守则,重点在於让读者们未来在接触原始码时,不会太紧张啊! 好了,基本的 makefile 守则是这样的:
标的(target): 目标档1 目标档2 <tab> gcc -o 欲创建的运行档 目标档1 目标档2
那个标的 (target) 就是我们想要创建的资讯,而目标档就是具有相关性的 object files ,那创建运行档的语法就是以 <tab> 按键开头的那一行!特别给他留意喔,『命令列必须要以 tab 按键作为开头』才行!他的守则基本上是这样的:
在 makefile 当中的 # 代表注解;
<tab> 需要在命令行 (例如 gcc 这个编译器命令) 的第一个字节;
标的 (target) 与相依文件(就是目标档)之间需以『:』隔开。
同样的,我们以刚刚上一个小节的范例进一步说明,如果我想要有两个以上的运行动作时, 例如下达一个命令就直接清除掉所有的目标档与运行档,该如何制作呢?
# 1. 先编辑 makefile 来创建新的守则,此守则的标的名称为 clean : [root@www ~]# vi makefile main: main.o haha.o sin_value.o cos_value.o gcc -o main main.o haha.o sin_value.o cos_value.o -lm clean: rm -f main main.o haha.o sin_value.o cos_value.o # 2. 以新的标的 (clean) 测试看看运行 make 的结果: [root@www ~]# make clean <==就是这里!透过 make 以 clean 为标的 rm -rf main main.o haha.o sin_value.o cos_value.o
如此一来,我们的 makefile 里面就具有至少两个标的,分别是 main 与 clean ,如果我们想要创建 main 的话,输入『make main』,如果想要清除有的没的,输入『make clean』即可啊!而如果想要先清除目标档再编译 main 这个程序的话,就可以这样输入:『make clean main』,如下所示:
[root@www ~]# make clean main rm -rf main main.o haha.o sin_value.o cos_value.o cc -c -o main.o main.c cc -c -o haha.o haha.c cc -c -o sin_value.o sin_value.c cc -c -o cos_value.o cos_value.c gcc -o main main.o haha.o sin_value.o cos_value.o -lm
这样就很清楚了吧!但是,你是否会觉得,咦! makefile 里面怎么重复的数据这么多啊!没错!所以我们可以再藉由 shell script 那时学到的『变量』来更简化 makefile 喔:
[root@www ~]# vi makefile LIBS = -lm OBJS = main.o haha.o sin_value.o cos_value.o main: ${OBJS} gcc -o main ${OBJS} ${LIBS} clean: rm -f main ${OBJS}
与 bash shell script 的语法有点不太相同,变量的基本语法为:
变量与变量内容以『=』隔开,同时两边可以具有空格;
变量左边不可以有 <tab> ,例如上面范例的第一行 LIBS 左边不可以是 <tab>;
变量与变量内容在『=』两边不能具有『:』;
在习惯上,变量最好是以『大写字母』为主;
运用变量时,以 ${变量} 或 $(变量) 使用;
在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变量!
在命令列模式也可以给予变量。
由於 gcc 在进行编译的行为时,会主动的去读取 CFLAGS 这个环境变量,所以,你可以直接在 shell 定义出这个环境变量,也可以在 makefile 文件里面去定义,更可以在命令列当中给予这个咚咚呢!例如:
[root@www ~]# vi makefile LIBS = -lm OBJS = main.o haha.o sin_value.o cos_value.o CFLAGS = -Wall main: ${OBJS} gcc -o main ${OBJS} ${LIBS} clean: rm -f main ${OBJS}
咦!我可以利用命令列进行环境变量的输入,也可以在文件内直接指定环境变量,那万一这个 CFLAGS 的内容在命令列与 makefile 里面并不相同时,以那个方式输入的为主?呵呵!问了个好问题啊! 环境变量取用的守则是这样的:
make 命令列后面加上的环境变量为优先;
makefile 里面指定的环境变量第二;
shell 原本具有的环境变量第三。
此外,还有一些特殊的变量需要了解的喔:
$@:代表目前的标的(target)
所以我也可以将 makefile 改成:
[root@www ~]# vi makefile LIBS = -lm OBJS = main.o haha.o sin_value.o cos_value.o CFLAGS = -Wall main: ${OBJS} gcc -o $@ ${OBJS} ${LIBS} <==那个 $@ 就是 main ! clean: rm -f main ${OBJS}
转自:http://vbird.dic.ksu.edu.tw/linux_basic/0520source_code_and_tarball_3.php
发表评论
文章已被作者锁定,不允许评论。
-
Linux ubuntu配置SSH免密登陆
2017-05-05 16:15 4631、安装 Ubuntu14.04默认安装了ssh-client ... -
Linux ubuntu虚拟机连接上网总结
2017-05-05 13:37 5111.首先查看主机的ip信息 ipconfig /all ... -
Linux七个运行级别
2015-03-03 09:20 550运行级别就是操作系统当前正在运行的功能级别。级别是从0到6,具 ... -
第二十四章 CentOS 系统配置工具: setup
2014-10-30 20:05 677系统配置除了使用手动 ... -
第二十二章 启动过程的问题解决
2014-10-28 19:34 426很多时候,我们可能因 ... -
第二十二章 Boot Loader: Grub
2014-10-27 19:44 574在看完了前面的整个启 ... -
第二十二章 核心与核心模块
2014-10-23 19:28 346谈完了整个启动的流程 ... -
第二十二章 Linux 的启动流程分析
2014-10-22 20:08 391启动不是只要按一下电 ... -
第二十一章 管理的抉择:RPM 还是 Tarball
2014-10-20 19:24 500这一直是个有趣的问题 ... -
第二十一章 YUM 线上升级机制
2014-10-15 19:33 528我们在本章一开始的地方谈到过 yum 这玩意儿,这个 yum ... -
第二十一章 SRPM 的使用 : rpmbuild
2014-10-14 19:44 965谈完了 RPM 类型的软件之后,再来我们谈一谈包含了 Sour ... -
第二十一章 RPM 软件管理程序: rpm
2014-10-13 20:10 457RPM 的使用其实不难,只要使用 rpm 这个命令即可!鸟哥最 ... -
第二十章 函式库管理
2014-10-13 19:25 478在我们的 Linux 操作系统 ... -
第二十章 Tarball 的管理与建议
2014-10-10 19:54 496在我们知道了原始码的 ... -
第二十章 开放源码的软件安装与升级简介
2014-10-09 19:47 441如果鸟哥想要在我的 Lin ... -
第十九章 分析登录文件
2014-10-08 19:34 408登录文件的分析是很重要的!你可以自行以 vi 进入登录文 ... -
第十九章 登录文件的轮替(logrotate)
2014-10-08 19:28 512假设我们已经将登 ... -
第十九章 syslogd :记录登录文件的服务
2014-09-28 20:11 680刚刚提到说 Linux 的登录文件主要是由 syslogd 在 ... -
第十八章 系统开启的服务
2014-09-25 19:33 717好了,现在假设你已经知道了 daemons 的启动文件放置的目 ... -
第十八章 服务的防火墙管理 xinetd, TCP Wrappers
2014-09-24 19:47 552一般来说,系统的防火 ...
相关推荐
这里我们将按照一系列步骤进行操作,确保每个组件正确安装和配置。 首先,我们需要安装HTTP服务器Apache。在案例中,我们使用的是Apache 2.4.18版本,通过源代码编译安装。执行以下命令来下载、解压、配置、编译和...
第二章:GNU make 介绍 2.1 Makefile简介 2.2 Makefile规则介绍 2.3 简单的示例 2.4 make如何工作 2.5 指定变量 2.6 自动推导规则 2.7 另类风格的makefile 2.8 清除工作目录过程文件 第三章:Makefile 总述...
第二章:GNU make 介绍 2.1 Makefile简介 2.2 Makefile规则介绍 2.3 简单的示例 2.4 make如何工作 2.5 指定变量 2.6 自动推导规则 2.7 另类风格的makefile 2.8 清除工作目录过程文件 第三章:Makefile 总述...
第1章 概论 1 1.1 为什么要用编译器 2 1.2 与编译器相关的程序 3 1.3 翻译步骤 5 1.4 编译器中的主要数据结构 8 1.5 编译器结构中的其他问题 10 1.6 自举与移植 12 1.7 TINY样本语言与编译器 14 1.7.1 TINY语言 15 ...
第二章 搭建QT CREATOR 交叉编译环境: 2.1 配置Qt Creator: 要使Qt Creator支持交叉编译,需要设置正确的编译套件(Kits)。按照以下步骤操作: 1. 打开Qt Creator,选择“工具” -> “选项” -> “设备” -> ...
第二章:GNU make 介绍 2.1 Makefile简介 2.2 Makefile规则介绍 2.3 简单的示例 2.4 make如何工作 2.5 指定变量 2.6 自动推导规则 2.7 另类风格的makefile 2.8 清除工作目录过程文件 第三章:Makefile 总述...
**第二章:GNU make 介绍** 2.1 Makefile简介:解释了Makefile是什么,它是如何组织的,以及它在构建过程中的角色。 2.2 Makefile规则介绍:说明了规则是如何定义依赖关系和构建步骤的。 2.3 简单的示例:提供了简单...
GNU Make 是一个用于自动确定大型程序哪些部分需要重新编译,并发出相应命令进行编译的工具。它能够有效地管理复杂的软件项目,确保项目的每个部分仅在必要时才被重新编译。 - **版本与日期**:该手册针对的是 GNU ...
13. **第 13 章:不兼容性和缺失特性** —— 列举了与其它 make 实现之间的差异以及 GNU Make 当前版本中缺少的功能。 14. **第 14 章:makefile 编写约定** —— 给出了一些编写 makefile 的最佳实践建议。 15. **...
使用`makemenuconfig`命令进入文本模式的配置界面,或使用`makexconfig`命令在图形界面下进行配置(需安装`gtk-devel`)。配置过程需要根据系统的硬件特性、性能需求以及安全考虑来定制内核功能。 #### 六、编译...
为了进一步了解和使用Bear,你需要解压这个文件,阅读README或其他文档,按照指示进行编译和安装。 总的来说,Bear是一个方便C/C++开发者使用的工具,它简化了构建过程中生成编译数据库的步骤,提升了开发效率和...
**第二步**,安装JDK,根据你的Linux发行版,可以使用`apt-get`或`yum`等包管理器进行安装。 **第三步**,设置环境变量,包括`JAVA_HOME`,确保指向正确的JDK路径,并使`~/.bashrc`或`~/.profile`文件生效。 **第...
在Ubuntu系统中进行流体程序的编译,通常涉及到多个库的安装与配置。本文档将详细介绍如何在Ubuntu环境下搭建必要的开发环境,并逐一安装和配置所需的第三方库。通过遵循本文档的指导,您将能够顺利地完成一个流体...
下载 Linux 内核的源代码是编译内核的第一步。我们可以使用以下命令来下载 Linux 内核: ```bash sudo apt-get source linux-image-$(uname -r) ``` 五、移动到 /usr/src 下面并解压 下载后的 Linux 内核源代码...
第二种编译方法: 结合bash源代码编译和安装bashdb 需要准备bash源代码 a).下载bash-4.2.46的src.rpm bash-4.2.46-20.el7_2.src.rpm http://vault.centos.org/7.3.1611/os/Source/SPackages/ b). 提取bash-4.2.46...
**第二步:解压内核并进入内核目录** 接下来,解压 `linux-2.6.35.tar.bz2` 并进入该目录。 ``` $ tar xvf linux-2.6.35.tar.bz2 $ cd linux-2.6.35 ``` **第三步:配置编译参数** 为了使内核能够在ARM架构上正确...
- **编译工具**:继续使用`make`命令来编译各种组件。 ##### 6.2 安装 - **安装工具**:安装编译好的工具到系统中。 #### 七、档案系统 档案系统是操作系统中用于组织和管理文件的一套机制。 ##### 7.1 简介 -...
GUN make 中文手册 译者:徐海兵 2004-09-11 3.5.6 库文件和搜索目录 .................................................................................................... 36 3.6 Makefile伪目标.................
"0.20.0"表示这是cutecom的第20个次要版本,通常意味着它在功能上经过多次迭代和完善。而".tar.gz"则是两种常见的压缩格式组合,首先是".tar",它是一个归档工具,可以将多个文件或目录打包成一个单一的文件,便于...