实例学习写Makefile文件
目录
0. 扫盲
1. 编译,链接
2. Makefile文件执行
3. Makefile书写规则
4. 案例
5. Makefile是如何工作的
6. 拔高,参考
0. 扫盲
Linux 环境下的程序员如果不会使用GNU make来构建和管理自己的工程,应该不能算是一个合格的专业程序员,至少不能称得上是 Unix程序员(是不是夸张了点,别人说的)。
什么是makefile文件?它是一个指挥文件,指挥着源文件编译的先后顺序,以及如何链接在一起。
1. 编译,链接
2. Makefile文件执行
写好Makefile(或写成makefile)文件后,直接执行命令make,编译器会自动执行makefile里的命令,进行编译、链接知道生成最终可以执行的文件。即
make
3. Makefile书写规则
target : objects
command
其中
- target是可以是目标文件(.o)也可以是可执行文件,还可以是个标签(最后说)
- objects是生成target依赖的文件
- command是make要执行的文件(可以是任意Shell命令)
- 特殊字符:$@:目标文件,$^:所有的依赖文件,$<:第一个依赖文件
4. 案例
假设文件的关系如下图
写法1
main2 : main2.o sum.o hello.o
g++ -o main2 main2.o sum.o hello.o
main2.o : main2.cc sum.h
g++ -c main2.cc
sum.o : sum.cc sum.h hello.h
g++ -c sum.cc
hello.o : hello.cc hello.h
g++ -c hello.cc
参数 -o 后面是可执文件; -c后面是待编译的文件。在前两行中写了很多重复的.o文件,可以把它集合起来,用变量表示,如下:
写法2
objects = main2.o sum.o hello.o
main2 : $(objects)
g++ -o main2 $(objects) main2.o : main2.cc sum.h
g++ -c main2.cc
sum.o : sum.cc sum.h hello.h
g++ -c sum.cc
hello.o : hello.cc hello.h
g++ -c hello.cc
GUN的make相当强大,它可以自动推导文件集文件依赖关系,写法如下:
写法3
objects = main2.o sum.o hello.o
main2 : $(objects)
g++ -o main2 $(objects) main2.o : sum.h
sum.o : sum.h hello.h
hello.o : hello.h
文件执行完了以后生成很多.o文件,能不能可以删除掉,可以的,写上命令(例如clean),下面是执行的操作,例如:
写法4
objects = main2.o sum.o hello.o
main2 : $(objects)
g++ -o main2 $(objects) main2.o : sum.h
sum.o : sum.h hello.h
hello.o : hello.h clean:
rm *.o
这样执行 make clean,就会执行rm *.o 删除所有的.o文件,即
make clean
5. Makefile如何工作的?
- 输入make后,会在目录找Makefile、makefile
- 如果找到,它会在文件中找到第一个目标文件(例子中的main2)作为最终的目标文件
- 如果main2不存在,就依靠后边的.o文件生成
- 如果后边的.o不存在,就利用下边的g++ -c 生成
- .o文件都够了,就链接生成最终的目标文件
6. 拔高,参考
跟我一起写Makefile-陈皓
实例学习写Makefile文件的更多相关文章
- 怎样写Makefile文件(C语言部分)
本文摘抄自"跟我一起写Makefile ",只是原文中我自己感觉比较精要的一部分,并且只针对C语言,使用GCC编译器. 原文请看这里:http://wiki.ubuntu.org. ...
- 第一次写Makefile文件
test.c文件内容 #include <stdio.h> int main(int argc, char const *argv[]) { printf("hahahah\n& ...
- linux下使用automake工具自动生成makefile文件
linux环境下,当项目工程很大的时候,编译的过程很复杂,所以需要使用make工具,自动进行编译安装,但是手写makefile文件比较复杂,所幸在GNU的计划中,设计出了一种叫做Autoconf/Au ...
- 利用qmake生成Makefile文件
在linux下写程序,免不了要写Makefile文件,用automake,总感觉比较麻烦,linux人喜欢做麻烦的事,以显得风格迥异. 其实用qmake生成Makefile文件相当简单. 1 装好qm ...
- C++ Makefile文件编写
对现有的一个C++动态库文件和调用程序,分别编写Makefile文件,从零开始,这里把自己弄明白的一些东西分享给大家. 1.必须明确Linux下,C++的编译器是g++,C语言的是gcc.网上大多数又 ...
- 如何编写makefile文件
最近一直在学习makefile是如何编写的. 当我们写的程序文件比较少的时候,敲入gcc /g++,当你在大型工程中,在一个个编译文件的话,你可能就会很郁闷.linux有一个自带的make ...
- Makefile文件应用——simple项目
学习资料 本文主要参考资料:驾驭Makefile(李云).pdf 原理 (1)最基本的语法 targets: prerequisites command targets是目标,prerequisite ...
- 写makefile时候的cc和gcc
Linux 下 的 cc 和 gcc Linux 下 的 cc 和 gcc 周银辉 在Linux下一会看到cc,另一会又看到gcc,感觉又点混乱的样子.它们是同一个东西么,有啥区别呢 一分为二 ...
- 一点一点学写Makefile(3)-增加第三方库和头文件
我们在写代码的时候不一定都是有自己来完成,一个工程中会大量使用一些比较优秀的动态库.静态库等,我们在使用这些库完成所有的代码后,需要在编译的时候将这些库使用的头文件添加到我们的工程上,将他的库文件也添 ...
随机推荐
- Python中Cookie的处理(一)Cookie库
Cookie用于服务器实现会话,用户登录及相关功能时进行状态管理.要在用户浏览器上安装cookie,HTTP服务器向HTTP响应添加类似以下内容的HTTP报头: Set-Cookie:session= ...
- django post报403问题
第一个问题是: 我使用jquery的ajax向后台传值, 当使用GET方法时没问题 $.ajax({ type:"GET" url: data: success: }) 但是由于基 ...
- erp与电子商务集成的结构图
集约化采购管理系统和电子商务平台统一规划.统一设计,通过系统之间的安全接口全面集成,进而实现资源共享和数据共享,企业内外部系统运作的一体化,建立企业同上.下游合作伙伴的电子数据交互,从而提高电子商务的 ...
- Python流程控制
if语句: --Pyhon中的IF跟其他语言类似,if包含一个逻辑表达式,使用表达式比较,在比较的结果的基础上做出判断 --if expression: statement(s) 注意:Python使 ...
- hadoop相关问题
发现一篇不错的文章,转一下.http://www.cnblogs.com/xuekyo/p/3386610.html HDFS导论(转) 1.流式数据访问 HDFS的构建思想是这样的:一次写入,多 ...
- 深入理解ThreadLocal(二)
3 InheritableThreadLocal的使用 通过上面的分析知道通过ThreadLocal保存的值是线程隔离的.其实在Thread对象中,还有一个ThreadLocal.ThreadLoca ...
- MVC 使用 FluentScheduler 定时器计划任务
MVC 使用 FluentScheduler 定时器计划任务 MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲 ...
- javascript基础之客户端事件驱动
我们知道,面向对象发展起来后,“一夜之间”,几乎所有的语言都能基于对象了,JavaScript也是基于对象的语言.用户在浏览器上的行为称作“事件”,之后引发的一系列动作,比如弹窗啦,改变浏览器大小啦, ...
- C#的配置文件App.config使用总结 - 转
http://blog.csdn.net/celte/article/details/9749389 首先,先说明,我使用的app.config 配置文件的格式如下: <?xml version ...
- sqlserver 2008 卸载时提示 “重新启动计算机”失败
问题:sqlserver 2008 卸载时提示 “重新启动计算机”失败 解决办法: 1.打开注册表:开始->运行: regedit 2.找到HKEY_LOCAL_MACHINE\SYSTEM\C ...