介绍一下Makefile的简单编写例子。

编写Makefile的规则就是:

目标文件:依赖文件
(tab)编译规则

现在我有一个文件目录结构为:

解释一下这几个文件。首先我创建makefile目录,底下有一个include目录和src目录。include目录存放一个head.h头文件,是我们src中所有cpp文件都要引用的头文件。

这四个cpp文件就是实现加减乘除的功能。把add.cpp看一下就知道了:

#include "head.h"

int add(int a, int b)
{
return a + b;
}

其余都一样,做各自的运算而已。而main.cpp中我调用了它们:

int main(int argc, char const *argv[])
{
printf("sum = %d\n", add(10, 3));
printf("mul = %d\n", mul(10, 3));
printf("sub = %d\n", sub(10, 3));
printf("div = %lf\n", div(10, 3));
return 0;
}

直接编写,易于理解

现在我们要实现的功能就很明了了,编译这几个cpp,生成一个可执行文件,使得我们能够正确运行结果。这里面我写了两个Makefile文件,第一个是Makefile_SB(改名之后),这个用来理解makefile的编写规则很有用:

main:main.o add.o mul.o sub.o div.o
g++ -o main add.o mul.o sub.o div.o main.o
main.o:main.cpp
g++ -c -I ../include main.cpp
add.o:add.cpp ../include/head.h
g++ -c -I ../include add.cpp
mul.o:mul.cpp ../include/head.h
g++ -c -I ../include mul.cpp
sub.o:sub.cpp ../include/head.h
g++ -c -I ../include sub.cpp
div.o:div.cpp ../include/head.h
g++ -c -I ../include div.cpp
.PHONY:clean
clean:
rm -f *.o

以上,我们遵循我们的规则:

目标文件:依赖文件
(tab)编译规则

首先,main是我们最后要生成的可执行文件,它依赖于所有的.o文件,编译规则就是直接g++ -o .o文件即可。

然后,我们的.o文件呢,又依赖于.c文件,所以下面也要写。其中要注意,头文件在上层目录的include下,所以要加上:

-I ../include

至于.PHONY,是一个伪目标,我们真正的目标都是会生成的,而clean只是我们清除文件使用的,它并不生成一个目标文件,所以我们使用伪目标来执行这个命令。

简洁编写,使用函数

在我目录下的Makefile文件,才是我最后使用的那个文件:

#获取.cpp文件
SrcFiles=$(wildcard *.cpp)
#使用替换函数获取.o文件
ObjFiles=$(patsubst %.cpp,%.o,$(SrcFiles))
#生成的可执行文件
all:main
#目标文件依赖于.o文件
main:$(ObjFiles)
g++ -o $@ -I ../include $(SrcFiles)
#.o文件依赖于.cpp文件,通配使用,一条就够
%.o:%.cpp
g++ -c -I ../include $< .PHONY:clean all clean:
rm -f *.o
rm -f main

有了我们上面的规则讲解之后,这个就能很好的理解。先介绍两个函数:

  • wildcard函数,就是获取指定的文件
  • patsubst函数,有替换功能。

而SrcFiles和ObjFiles都是变量,它不用特别的定义,直接写出来就是定义了。

再写一下其它符号的意义,记住就行了:

  • $(Files),取File变量的值。
  • $@ 目标文件
  • $^ 全部依赖
  • $< 第一个依赖
  • $? 第一个变化的依赖

Makefile简单编写实例的更多相关文章

  1. 一个简单的makefile文件编写

    下午闲来无聊,就打开很久没动过的linux系统想熟悉熟悉在linux上面编译代码,结果一个makefile文件搞到晚上才搞定,哈哈! 先把代码简单贴上来,就写了一个冒泡排序: sort.h: #ifn ...

  2. 简单编写makefile文件,实现GCC4.9编译项目,增加boost库測试等等。。

    一.须要用到的hw.cpp hw.h funtest.cpp funtest.h makefile 几个測试文件 1.hw.cpp代码例如以下: #include "hw.h" # ...

  3. Linux Makefile文件编写详细步骤与实践

    Linux Makefile文件编写详细步骤与实践 1.makefile概述 Windows环境下IDE会帮你完成makefile文件的编写,但在UNIX环境下你就必须自己写makefile了,会不会 ...

  4. Redis:安装、配置、操作和简单代码实例(C语言Client端)

    Redis:安装.配置.操作和简单代码实例(C语言Client端) - hj19870806的专栏 - 博客频道 - CSDN.NET Redis:安装.配置.操作和简单代码实例(C语言Client端 ...

  5. 运用Unity实现依赖注入[结合简单三层实例]

    运用Unity实现依赖注入[结合简单三层实例] 一:理论部分 依赖注入:这是 Ioc 模式的一种特殊情况,是一种基于改变对象的行为而不改变类的内部的接口编程技术.开发人员编写实现接口的类代码,并基于接 ...

  6. makefile的编写规则

    2.       编写makefile 示例: test:main.o func.o gcc -o test main.o func.o func.o:func.c gcc -c func.c mai ...

  7. 《转》Robot Framework 的安装配置和简单的实例介绍

    Robot Framework 介绍 Robot Framework 是一款基于 Python 的功能自动化测试框架.它具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进 ...

  8. 一个通用Makefile的编写

    作者:杨老师,华清远见嵌入式学院讲师. 我们在Linux环境下开发程序,少不了要自己编写Makefile,一个稍微大一些的工程下面都会包含很多.c的源文件.如果我们用gcc去一个一个编译每一个源文件的 ...

  9. 【C语言C++编程学习笔记】基础语法,第一个简单的实例编程入门教程!

    C语言/C++编程学习:一个简单的实例 让我们来看一个简单的C语言程序.从下面的程序可以看出编写C语言程序的一些基本特征.   如果你能知道该程序将会在显示器上显示一些内容,那说明你还是知道一些的! ...

随机推荐

  1. HUD 4507 吉哥系列故事——恨7不成妻

    传送门 三个限制都可以数位 $dp$ , $dfs$ 是维护当前位,之前各位总和模 $7$ 意义下的值,之前填的数模 $7$ 意义下的值,是否贴着限制 主要现在求的是各个合法数的平方的和,比较恶心 开 ...

  2. 进阶Java编程(8)反射应用案例

    1,反射实例化对象 经过一系列分析之后可以发现虽然获得了Class类的实例化对象但是依然觉得这个对象获取的意义不是很大,所以为了进一步的帮助大家理解反射的核心意义所在,下面将通过几个案例进行说明(都是 ...

  3. 帝国cms 从数据库删除端口

    phome_enewsmoreport  这个表控制着帝国cms多端口.

  4. nginx php-fpm环境搭建权限问题

    如果nginx的work process和php-fpm的运行权限相同,在logrotate的影响下,会导致被上传webshell后 被修改accesslog 故安全配置: nginx.conf: u ...

  5. TCP/IP网络知识

    1.TCP/IP概念 TCP/IP不是单指一种传输协议,而是一组传输控制协议/互联网协议. 2.TCP/IP分层 (计算机网络中,实际应用的网络协议是TCP/IP协议族,TCP/IP的应用层大体上对应 ...

  6. deep_learning_Dropout

    吴恩达深度学习笔记(十一)—— dropout正则化 主要内容: 一.dropout正则化的思想 二.dropout算法流程 三.dropout的优缺点 一.dropout正则化的思想 在神经网络中, ...

  7. oracle下关于table的常用sql整理

    创建表,create TABLE table( 列名称1 数据类型1, 列名称2 数据类型2, 列名称3 数据类型3, ......); eg: create table TABLE_24751( i ...

  8. opencv,用摄像头识别贴片元件的定位和元件的角度(转载)

    经过半个月学习opencv有点小成果,用摄像头识别贴片元件的定位和元件的角度(转载) (2013-04-17 16:00:22) 转载▼   分类: 学习笔记 先说一下开源的opencv真是一件伟大的 ...

  9. 返回的json数据中有属性为null的情况,报错 "message" : "Could not write JSON: Object is null

  10. angularjs 实现下拉框编辑数据回显

    https://www.cnblogs.com/janice-jia/p/9764938.html 正常的js回显选择,需要添加 select ="selected",angula ...