如何编写makefile文件
2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“edit”这个文件,并把这个文件作为最终的目标文件。
3、如果edit文件不存在,或是edit所依赖的后面的 .o 文件的文件修改时间要比edit这个文件新,那么,他就会执行后面所定义的命令来生成edit这个文件。
4、如果edit所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)
5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o 文件生命make的终极任务,也就是执行文件edit了
- /////main.cpp
- #include "functions.h"
- int main()
- {
- print_hello();
- cout << endl;
- cout << "The factorial of 5 is " << factorial(5) << endl;
- return 0;
- }
- ///hello.cpp
- #include "functions.h"
- void print_hello()
- {
- cout << "Hello World!";
- }
- ///factorial.cpp
- #include "functions.h"
- int factorial(int n)
- {
- if(n!=1)
- { return(n * factorial(n-1)); }
- else return 1;
- }
- //functions.h
- void
- print_hello();
- int factorial(int n);
请将以上文件放到一个目录下。
请注意: 我用的是g++进行编译的,你也可以按照你自己的选择来编译程序
make的作用
如果你运行: make命令, 它将会自动的在你的目录下寻找makefile文件,然后执行它,如果你几个makefile文件,你可以指定某一个特定的makefile文件 使用如下命令:
make -f mymakefile
如果你想知道更多的make 用法,可以执行man make 命令
执行过程
- 编译器将会编译你的源文件,然后输出目标文件
- 链接器执行目标文件然后创建一个可执行文件。
最不理想的一种执行方式就是
g++ main.cpp hello.cpp factorial.cpp -o hello
akefile 基本规则
makefile的基本规则是有以下构成:
target: dependencies
[tab] system command
利用以上语法编写如下
all:
g++main.cpp hello.cpp factorial.cpp -o hello
然后运行你的makefile,如下
make -f Makefile-1
如上代码叙述,所写的目标是all,all是makefile默认的目标,如果没有其他规定,make语法将要执行这个目标文件。
我们还发现,all 目标并没有依赖的,所以按照命令让他安全的执行。
最后,make 通过 我们给的命令进行编译程序
使用依赖
这是因为,如果你修改一个单独的文件在你的项目,你不必重新编译一切,只有你修改。 请看下边的例子
- all: hello
- hello: main.o factorial.o hello.o
- g++ main.o factorial.o hello.o -o hello
- main.o: main.cpp
- g++ -c main.cpp
- factorial.o: factorial.cpp
- g++ -c factorial.cpp
- hello.o: hello.cpp
- g++ -c hello.cpp
- clean:
- rm -rf *o hello
我们看到目标all 只有依赖,没有系统命令。为了去执行正确,它必须满足所有的目标所依赖的。目标都回去搜索所有的依赖,然后去执行它。
在例子中,我们看到了clean的目标,clean 这个目标就是清楚中间生成的.o文件和那些可执行文件
使用变量和注释
当你写makefile文件的时候,当你想改变一些编译的一些选项的时候,他是非常有用处的。
- # 这是注释,CC 编译器.
- CC=g++
- # CFLAGS 是选项
- CFLAGS=-c -Wall
- # 目标文件
- OBJECTS=main.o factorial.o hello.o
- all: hello
- hello: $(OBJECTS)
- $(CC) main.o factorial.o hello.o -o hello
- main.o: main.cpp
- $(CC) $(CFLAGS) main.cpp
- factorial.o: factorial.cpp
- $(CC) $(CFLAGS) factorial.cpp
- hello.o: hello.cpp
- $(CC) $(CFLAGS) hello.cpp
- clean:
- rm -rf *o hello
你可以看到,使用这些有时候是非常有用的。你可以使用它们,赋值,当你想改变一些变量值的时候,然后你可以使用$(var),来应用这些变量。
如何继续下去
通过以上简要的介绍,你就可以简要的去编写一些更加复杂的makefile来运行你的复杂的程序了。上边讲的只是冰山一角,你可以通过拥有变量和函数的make的文档来写。
Makefile有三个非常有用的变量.分别是$@,$>,$<代表的意义分别是:
$@--目标文件,$>--所有的依赖文件,$<--第一个依赖文件.
经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点.这里我们学习
一个Makefile的缺省规则
..c.o:
gcc -c $<
这个规则表示所有的 .o文件都是依赖与相应的.c文件的.
- CC=g++
- CFLAGS=-c -Wall
- LDFLAGS=
- SOURCES=main.cpp hello.cpp factorial.cpp
- OBJECTS=$(SOURCES:.cpp=.o)
- EXECUTABLE=hello
- all: $(SOURCES) $(EXECUTABLE)
- $(EXECUTABLE): $(OBJECTS)
- $(CC) $(LDFLAGS) $(OBJECTS) -o $@
- .cpp.o:
- $(CC) $(CFLAGS) {1}lt; -o $@
如何编写makefile文件的更多相关文章
- 教会你如何编写makefile文件
最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...
- 根据给定文件编写Makefile文件 两种方法编译
实例一 1.分析源文件代码依赖关系 mian.c #include "test1.h" #include "test2.h" #include <stdi ...
- 转:教会你如何编写makefile文件
最近一直在学习makefile是如何编写的.当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make命令,它让你的 ...
- 为多个文件夹下的C源代码编写Makefile文件
上一篇文章写了如何为在同一个文件夹下的C源代码,本篇文章为多个文件夹下的C源代码编写Makefile文件. 建立两个文件夹,分别为abs与src.其最终目录结构如下: 1 $ ls * 2 jun.c ...
- 单文件夹下的C程序如何编写Makefile文件
通过学习已经学会了GCC的一些基础的命令,以及如何将C语言源代码编译成可执行文件. 我们已经知道在linux环境下编译源码时,常会有以下三个步骤: ./configure make make clea ...
- 简单编写makefile文件,实现GCC4.9编译项目,增加boost库測试等等。。
一.须要用到的hw.cpp hw.h funtest.cpp funtest.h makefile 几个測试文件 1.hw.cpp代码例如以下: #include "hw.h" # ...
- C++ Makefile文件编写
对现有的一个C++动态库文件和调用程序,分别编写Makefile文件,从零开始,这里把自己弄明白的一些东西分享给大家. 1.必须明确Linux下,C++的编译器是g++,C语言的是gcc.网上大多数又 ...
- 如何快速编写大项目的Makefile文件
在构建C++的后台服务时,经常需要自己来编写makefile文件,而如果没有合适的方法或模板时,编写makefile文件是一件很费时费力的事情.因此,为了帮助程序员高效准确的编写makefile文件, ...
- Makefile文件学习总结
Makefile文件相当于是一种脚本编程语言,目的是实现自动化编译.编写makefile文件的过程中可以使用变量.控制结构和函数等一般编程语言的特性. Makefile文件的组成内容.makefile ...
随机推荐
- RxJS入门之函数响应式编程
一.函数式编程 1.声明式(Declarativ) 和声明式相对应的编程⽅式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的⼀种编程⽅式. //命令式编程: fun ...
- JQuery Mobile - 修改复选框的选中状态无效解决办法!
今晚,在编写JQuery Mobile程序时候,需要在代码里面控制复选框的选中状态,很简单的代码啊,很快完成了!等测试程序时候傻眼了,页面无论如何也不按照我写的代码显示出来!问题出在哪里呢?是我写的控 ...
- 队列(链式队列)----C语言
链式队列----用链表实现,链式队列就是一个操作受限的单向链表,如果读者了解单向链表的建立过程,那理解链式队列就很容易了,先回顾一下单向链表的建立过程 (不熟悉单向链表的可以先看看另一片随笔,再回来看 ...
- [bug] VUE 的 template 中使用 ES6 语法导致页面空白
如果你在 template 中,使用了 es6 及以上的语法,那么,在部分ios.安卓.微信浏览器中,打开页面后显示一片空白内容.如下: <ul id="example-1" ...
- snmpv3-snmpd.conf解析
1.先指定createUser语句,设置密码和传输密钥. createUser user1 createUser user2 MD5 user2password createUser user3 MD ...
- JVM内存参数( -Xms -Xmx -Xmn -Xss 直接内存)
JVM调优总结 -Xms -Xmx -Xmn -Xss jvm 内存 在不同的情况下如何增大 及 PermGen space 相关 JVM日志和参数的理解 JVM崩溃Log日志分析 -Xms 为jvm ...
- css style 标签可编辑
一次偶然在鑫大技术博客上发现 style 标签配合contenteditable 可编辑属性 实现动态编辑css 这里我就回顾了下 contenteditable 可编辑属性 (这个属性并无浏 ...
- LruCache源码分析
LRU(Least Recently Used)是一种很常用的资源调度策略,与20/80原则契合,在资源达到上限时倾向保留最近经常访问的资源对象. Android中基于LRU实现了缓存对象,即LruC ...
- js的基础知识笔记
目录 一.基本数据类型 二.函数 三.面向对象 一.基本数据类型 1.使用var声明变量.使用;结尾.使用{}表示代码块.使用驼峰式命名 2.变量是弱类型的,即并不严格要求声明变量的类型,一个变量可以 ...
- AT24Cxx学习笔记
AT24Cxx是E2PRom的一个系列: 存储空间大小:AT24C02——2Kbit(256Bytes).AT24C04——4Kbit(512Bytes).AT24C08——8Kbit(1024Byt ...