相信很多Linux开发者 都得自己来写Makefile,刚开始学习学写这个的时候都会碰到很多困难,我之前没有自己独立完成过Makefile,都是在公司已有的模板上添加。现在突然有一个很大的想法就是从零开始写Makefile,这个博客就是我的学习笔记。

开始准备我写的代码,总共七个文件,内容都很简单,工程的下载地址是:               下载地址

代码如下:

  1. //add.h
  2. #ifndef ADD_H
  3. #define ADD_H
  4. int add(int a, int b);
  5. #endif // ADD_H
  6. //add.cpp
  7. #include "add.h"
  8. int add(int a, int b)
  9. {
  10. return a + b;
  11. }
  1. //mul.h
  2. #ifndef MUL_A
  3. #define MUL_A
  4. int mul(int a, int b);
  5. #endif // MUL_A
  6. //mul.cpp
  7. #include "mul.h"
  8. int mul(int a, int b)
  9. {
  10. return a * b;
  11. }
  1. //sub.h
  2. #ifndef SUB_H
  3. #define SUB_H
  4. int sub(int a, int b);
  5. #endif // SUB_H
  6. //sub.cpp
  7. #include "sub.h"
  8. int sub(int a, int b)
  9. {
  10. return a - b;
  11. }

接下来就是最重要的Makefile文件了

  1. //Makefile
  2. //make.force
  3. CROSS =
  4. CC = $(CROSS)gcc
  5. CXX = $(CROSS)g++
  6. DEBUG = -g -O2
  7. CFLAGS = $(DEBUG) -Wall -c
  8. RM = rm -rf
  9. SRCS = add.cpp sub.cpp mul.cpp main.cpp
  10. OBJS = $(patsubst %.cpp, %.o, $(SRCS))
  11. VERSION = 1.0.0.0
  12. TARGET = test.$(VERSION)
  13. $(TARGET) : $(OBJS)
  14. $(CXX) $^ -o $@
  15. $(OBJS):%.o : %.cpp
  16. $(CXX) $(CFLAGS) $< -o $@
  17. clean:
  18. $(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的更多相关文章

  1. 一点一点学写Makefile(3)-增加第三方库和头文件

    我们在写代码的时候不一定都是有自己来完成,一个工程中会大量使用一些比较优秀的动态库.静态库等,我们在使用这些库完成所有的代码后,需要在编译的时候将这些库使用的头文件添加到我们的工程上,将他的库文件也添 ...

  2. 一点一点学写Makefile(4) - 编译时指定宏参数

    我们在项目中有时为了方便会自定义一些与项目无关的功能,例如打印输出一些提示信息.将关键协议生成文件等,但是如果每次都通过修改代码的方法来实现,测试部门就会认为你改的这些代码可能会带来其他问题.对于这种 ...

  3. 一点一点学写Makefile(6)-遍历当前目录源文件及其子目录下源文件

    时候,我们在开发的时候需要将本次工程的代码分成多个子目录来编写,但是在Makefile的编写上却是个问题,下面我就教大家怎么构建带有子文件夹的源代码目录的自动扫描编译 下面这张图是我的文件树 这里面s ...

  4. 一点一点学写Makefile(5)-获取文件所在路径

    我们在开发一套代码时,应该保证工程放到任何一个目录中均可以编译成功,但是有时候链接库的时候会造成编译错误,本次就会告诉大家如何动态的获得工程所在的绝对路径 代码下载目录 选择Makefile-5 // ...

  5. 一点一点学写Makefile(2)-自动搜所当前目录下的所有源文件

    上个博客我们使用的是笨方法添加源文件,本次我要实现的是遍历文件夹来获得所有的cpp文件 //makefile CROSS = CC = $(CROSS)gcc CXX = $(CROSS)g++ DE ...

  6. 一点一点学ASP.NET系列

    转自:http://www.cnblogs.com/stwyhm/archive/2006/08/10/473075.html 做开发近两年了,自认为自己还算是个知道要上进的人,每天不停地学习,不停地 ...

  7. 学《跟我一起写Makefile》笔记发博词

    目录 笔记发博词 参考 笔记发博词 本系列笔记主要记录学了<跟我一起写Makefile>后的一些笔记 由于<跟我一起写Makefile>已经写得很详细了,所以我只是提取其中重要 ...

  8. 怎么写makefile?(转)

    跟我一起写 Makefile 陈皓 第一章.概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 pr ...

  9. 跟我一起写 Makefile

    转自 陈皓 的博客:http://blog.csdn.net/haoel/article/details/2886 1. 概述 2. 关于程序的编译和链接 3. Makefile 介绍 4. Make ...

随机推荐

  1. APP在实际开发中应注意的关键点

    在APP开发过程中,开发者比较注重的是功能模块的实现,从而忽略了APP的设计问题,特别是企业开发APP,但是,APP设计是APP开发中非常重要的一个环节,APP界面设计直接影响到APP用户的感官,因此 ...

  2. Python归纳 | 爬虫基础知识

    1. urllib模块库 Urllib是python内置的HTTP请求库,urllib标准库一共包含以下子包: urllib.error 由urllib.request引发的异常类 urllib.pa ...

  3. 遍历方式 && 数组方法 && 算法

    遍历方式 一般,我们常用for in遍历对象,使用for (var i = 0; i < len; i++) {}的方式来遍历数组,这是最常用的两种方式,但是优缺点呢? 1.for (var i ...

  4. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  5. Navicat Premium v12.0.23.0 安装,使用激活码激活

    1 下载 可以直接官网下载安装包,也可以直接到我的云盘下载 下载地址:https://pan.baidu.com/s/1apwU9cIKBTr-z0CuJEJ9gg 文件包中包含下面的文件: 2 安装 ...

  6. 游戏AI的生命力源自哪里?为你揭开MOBA AI的秘密!

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由wataloo发表在专栏wataloo的试验田 1 设计概要 1.1 设计原则和目的 英雄AI的目的主要有: 1.新手过渡局,让玩家刚 ...

  7. C# .net页面乱码

    可在web.config中设置 <globalization requestEncoding="utf-8" responseEncoding="utf-8&quo ...

  8. Quartz使用及注意事项

    Quartz使用及注意事项 前提:目前由于公司业务决定,大量使用Quartz,每天固定的时间点执行相应的业务逻辑,,几十个时间点应该是有的,某一个时间点如果没有执行带来的问题是巨大的.Quartz的稳 ...

  9. 融云会话界面导航上移-使用IQKeyboardManager

    关于IQKeyBoardManager挤出导航栏的解决方案 方法一: 写在前面 虽然修改后能解决导航栏被挤出去的问题,但是就目前来看是有副作用的,写这篇文章就是想大家来一起讨论,毕竟键盘处理还是比较头 ...

  10. Docker 创建镜像、修改、上传镜像

    Docker 创建镜像.修改.上传镜像 –创建镜像有很多方法,用户可以从 Docker Hub 获取已有镜像并更新,也可以利用本地文件系统创建一个. 一.创建镜像 创建镜像有很多方法,用户可以从 Do ...