相信很多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. 让android系统中任意一个view变成进度条

    1.效果 2.进度条背景drawable文件 结束后可以恢复原背景. <?xml version="1.0" encoding="utf-8"?> ...

  2. 【3dsMax安装失败,如何卸载、安装3dMax 2015?】

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  3. MySQL关联left join 条件on与where不同

    以下的文章主要讲述的是MySQL关联left join 条件on与where 条件的不同之处,我们现在有两个表,即商品表(products)与sales_detail(销售记录表).我们主要是通过这两 ...

  4. gcc 链接非标准名称库

    一般库的标准名称是libxxx.so或者libxxx.a, 如果没有, 也可以搞个linkname出来, 那就可以直接用 "-lxxx" 来链接了, 但要是你想直接用realnam ...

  5. C++程序设计基础(4)宏定义和内联

    1.知识点 1.1宏定义 (1)不带参数的宏定义 #define ERROR_MESSAGE -100 #define SECONDS_PER_DAY 60*60*60 (2)带参数宏定义,这种形式称 ...

  6. 适用于所有页面的基础样式base.css

    @charset "UTF-8"; /*css 初始化 */ html, body, ul, li, ol, dl, dd, dt, p, h1, h2, h3, h4, h5, ...

  7. 关于“System.Data.ProviderIncompatibleException”类型的异常

    作为刚学习MVC的菜鸟,因为平常的不努力学习.看书,所以只能参考官方的教程学习操作新手入门 一步一步认真的做,前天晚上出现了一个关于数据库连接字符串错误的问题,自己查了很多资料, 问了许多大神,他们的 ...

  8. C#学习笔记4

    1.C#只支持单一继承,若想要实现多重继承的效果.有2种方式: 第一种为传递继承,A为基类,B继承A,C继承B,通过传递来增迭要包含的元素,但这种继承的设计,在业务上具有明显的从属关系. 第二种为聚合 ...

  9. jqueryUI学习

    01.选项卡 拖动按钮<div id="tabs"> <ul> <li><a href="#tabs-1">第一 ...

  10. 移动端下滑刷新插件(jQuery插件)

    由于在工作不能独自开发,而且为了给他们方便,自己写过不少的插件,不过今天刚好空闲,发出刚好完成的,移动端的下滑到底刷新插件.我不是很喜欢写插件给别人用,因为用起来自然是简单的,没什么难度,所以一起分享 ...