一点一点学写Makefile-1
相信很多Linux开发者 都得自己来写Makefile,刚开始学习学写这个的时候都会碰到很多困难,我之前没有自己独立完成过Makefile,都是在公司已有的模板上添加。现在突然有一个很大的想法就是从零开始写Makefile,这个博客就是我的学习笔记。
开始准备我写的代码,总共七个文件,内容都很简单,工程的下载地址是: 下载地址
代码如下:
- //add.h
- #ifndef ADD_H
- #define ADD_H
- int add(int a, int b);
- #endif // ADD_H
- //add.cpp
- #include "add.h"
- int add(int a, int b)
- {
- return a + b;
- }
- //mul.h
- #ifndef MUL_A
- #define MUL_A
- int mul(int a, int b);
- #endif // MUL_A
- //mul.cpp
- #include "mul.h"
- int mul(int a, int b)
- {
- return a * b;
- }
- //sub.h
- #ifndef SUB_H
- #define SUB_H
- int sub(int a, int b);
- #endif // SUB_H
- //sub.cpp
- #include "sub.h"
- int sub(int a, int b)
- {
- return a - b;
- }
接下来就是最重要的Makefile文件了
- //Makefile
- //make.force
- CROSS =
- CC = $(CROSS)gcc
- CXX = $(CROSS)g++
- DEBUG = -g -O2
- CFLAGS = $(DEBUG) -Wall -c
- RM = rm -rf
- SRCS = add.cpp sub.cpp mul.cpp main.cpp
- OBJS = $(patsubst %.cpp, %.o, $(SRCS))
- VERSION = 1.0.0.0
- TARGET = test.$(VERSION)
- $(TARGET) : $(OBJS)
- $(CXX) $^ -o $@
- $(OBJS):%.o : %.cpp
- $(CXX) $(CFLAGS) $< -o $@
- clean:
- $(RM) $(TARGET) *.o
好了,这就是我的工程里面所有的代码和文件,这里面有Makefile文件和make.force两个文件,这两个文件的内容完全相同。在执行make命令的时候,系统会自动找到makefile或Makefile文件(注:尽可能使用Makefile名称,因为linux开发项目中,所有的文件名字都是小写,因此为了区分出make文件,将M大写),除此之外也可以手动指定make文件,使用"make
-f make.force"来指定将make.force文件作为执行make命令的文件,清理内容是("make clean -f
make.force")。
下来,开始一句一句的讲解Makefile文件的命令:
CROSS = //在开发时候,有时候会有嵌入式的选项
CC = $(CROSS)gcc
CXX = $(CROSS)g++
DEBUG = -g -O2 //这里一般设置为空,在编译时候手动指定,例如:make DEBUG="-g -O2"
CFLAGS = $(DEBUG) -Wall -c
RM = rm -rf
SRCS = add.cpp sub.cpp mul.cpp main.cpp //最笨的方法,将所有的.cpp文件添加到SRCS中
OBJS = $(patsubst %.cpp, %.o, $(SRCS)) //通过*.cpp文件获得同名的*.o文件
VERSION = 1.0.0.0 //版本信息
TARGET = test.$(VERSION) //组装文件名和版本信息
$(TARGET) : $(OBJS) //连接
$(CXX) $^ -o $@
$(OBJS):%.o : %.cpp //生成*.o文件
$(CXX) $(CFLAGS) $< -o $@
clean:
$(RM) $(TARGET) *.o
一点一点学写Makefile-1的更多相关文章
- 一点一点学写Makefile(3)-增加第三方库和头文件
我们在写代码的时候不一定都是有自己来完成,一个工程中会大量使用一些比较优秀的动态库.静态库等,我们在使用这些库完成所有的代码后,需要在编译的时候将这些库使用的头文件添加到我们的工程上,将他的库文件也添 ...
- 一点一点学写Makefile(4) - 编译时指定宏参数
我们在项目中有时为了方便会自定义一些与项目无关的功能,例如打印输出一些提示信息.将关键协议生成文件等,但是如果每次都通过修改代码的方法来实现,测试部门就会认为你改的这些代码可能会带来其他问题.对于这种 ...
- 一点一点学写Makefile(6)-遍历当前目录源文件及其子目录下源文件
时候,我们在开发的时候需要将本次工程的代码分成多个子目录来编写,但是在Makefile的编写上却是个问题,下面我就教大家怎么构建带有子文件夹的源代码目录的自动扫描编译 下面这张图是我的文件树 这里面s ...
- 一点一点学写Makefile(5)-获取文件所在路径
我们在开发一套代码时,应该保证工程放到任何一个目录中均可以编译成功,但是有时候链接库的时候会造成编译错误,本次就会告诉大家如何动态的获得工程所在的绝对路径 代码下载目录 选择Makefile-5 // ...
- 一点一点学写Makefile(2)-自动搜所当前目录下的所有源文件
上个博客我们使用的是笨方法添加源文件,本次我要实现的是遍历文件夹来获得所有的cpp文件 //makefile CROSS = CC = $(CROSS)gcc CXX = $(CROSS)g++ DE ...
- 一点一点学ASP.NET系列
转自:http://www.cnblogs.com/stwyhm/archive/2006/08/10/473075.html 做开发近两年了,自认为自己还算是个知道要上进的人,每天不停地学习,不停地 ...
- 学《跟我一起写Makefile》笔记发博词
目录 笔记发博词 参考 笔记发博词 本系列笔记主要记录学了<跟我一起写Makefile>后的一些笔记 由于<跟我一起写Makefile>已经写得很详细了,所以我只是提取其中重要 ...
- 怎么写makefile?(转)
跟我一起写 Makefile 陈皓 第一章.概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 pr ...
- 跟我一起写 Makefile
转自 陈皓 的博客:http://blog.csdn.net/haoel/article/details/2886 1. 概述 2. 关于程序的编译和链接 3. Makefile 介绍 4. Make ...
随机推荐
- Djang视图层
视图 1.什么是视图 视图就是Django项目下的view.py,它的内部是一系列的函数或者是类,用来专门处理客户端访问请求并且返回相应的数据,相当于一个中央处理系统. 2.具体视图实例 3.CBV和 ...
- 获取各站点的ID
using (var serverManager = new ServerManager()) { foreach(var site in serverManager.Sites) { Console ...
- PIE SDK地图鼠标事件监听
1.功能简介 地图鼠标事件包含鼠标的按下MouseDown(),弹起MouseUp(),移动MouseMove()等事件,通过这些事件可以对地图进行动态的操作,接下来以地图状态栏的信息为例具体介绍如何 ...
- DbUtils(二) 结果集实例
单行数据处理:ScalarHandler ArrayHandler MapHandler BeanHandler 多行数据处理:BeanListHandler Abstract ...
- logrtate 切割详解
Logrotate是Linux下一款日志管理工具,可用于日志文件的转储(即删除旧日志文件,创建新日志文件).可以根据日志大小或者按照某时段间隔来转储,内部使用cron程序来执行.Logrotate还可 ...
- GreenPlum 大数据平台--运维(一)
.最后分析或真空或创建表或等... Select * from pg_stat_operations where schemaname='SCHEMA NAME ' and actionname in ...
- (转) sync命令
sync sync命令 sync命令用于强制被改变的内容立刻写入磁盘,更新超块信息. 在Linux/Unix系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的 ...
- 详细讲解Android的网络通信(HttpUrlConnection和HttpClient)
前言,Android的网络通信的方式有两种:使用Socket或者HTTP,今天这一篇我们详细讲解使用HTTP实现的网络通信,HTTP又包括两种方式编程方式: (1)HttpUrlConnection: ...
- lua输入函数名字符串执行函数
str = "testA()"loadstring(str)() function testA() ------end 使用loadstring即可执行后面在xlua用了下发现不能 ...
- java将list分为指定大小的新集合
上代码: import java.util.ArrayList; import java.util.List; public class JayCommonUtil { /** * 按指定大小,分隔集 ...