一聚教程网:一个值得你收藏的教程网站

最新下载

makefile详解,c++关于makefile的详解含通用模板

时间:2018-12-24 10:20:41 编辑:猪哥 来源:转载

介绍

Makefile是一个规定了怎么去编译和链接程序的脚本文件,在执行make命令时会执行该文件,window环境下的IDE,如visual studio已经集成了该功能,不需要关心程序的编译规则,在linux下做C/C++开发时经常用到,说到这里首先要知道一个工具make。

make是一个解释Makefile中指令的命令工具,常见的IDE都集成了这个工具。目前centos 7.3 GNU的make版本是3.82

规则

目标文件:依赖文件

[Tab]系统指令1     (注意:系统指令前必须有tab)

使用

3.1 简单使用

现有文件main.cpp  test.cpp test.h三个文件,说些Makefile实现增量编译(当其中有一个文件变化时,重新编译该文件)

helloworld: main.o test.o
  g++ main.o test.o -o helloworld
main.o: main.cpp test.h
  g++ -c main.cpp -o main.o
test.o: test.cpp test.h
  g++ -c test.cpp -o test.o
clean:
  rm *.o helloworld

3.2 makefile中使用注释,变量和函数

注释:

    行前面加"#"号,如#g++ main.o test.o -o helloworld  表示注释了该行

变量:

  •     用=定义一个变量,并且赋值(等号两边可以加空格)
  •     用+=追加字符串
  •     用$(A)来取得变量的值

例: 

A = src
  echo $(A) 
  @echo $(A) ##只输出echo的结果,不显示执行的命令

特殊变量:

  •     $@ 目标文件
  •     $^ 依赖项列表
  •     $< 依赖项列表第一项

函数:

    Makefile中有一些预定义函数,形式:

    $(函数名 参数列表)
    参数列表:以逗号分隔
    函数名和参数之间用空格分开

    #获取当前目录路径
    PWD = $(shell pwd)

    #获取当前目录下所有.cpp文件
    CXX_SOURCES = $(wildcard *.cpp)

    #获取当前目录下所有.cpp文件编译后的所有目标文件.o
    CXX_OBJECTS = $(patsubst *.cpp *.o, $(CXX_SOURCES))

3.3 优化3.1中Makefile

EXE = helloworld
GCC = g++
$(EXE): main.o test.o
    $(GCC) $^ -o $(EXE)
main.o: main.cpp test.h
    $(GCC) -c $< -o $@
test.o: test.cpp test.h
    $(GCC) -c $< -o $@
clean:
    rm *.o $(EXE)

3.4 优化3.3中Makefile

继续优化Makefile,添加文件夹,把源码都放入src和lib文件夹,保持增量编译,即为Makefile通用模板

EXE = helloworld
GCC = g++
SUBDIR = src lib
CPP_SOURCES = $(foreach dir, $(SUBDIR), $(wildcard $(dir)/*.cpp))
CPP_OBJECTS = $(patsubst %.cpp, %.o, $(CPP_SOURCES))
DEP_FILES = $(patsubst %.o, %.d, $(CPP_OBJECTS))
$(EXE): $(CPP_OBJECTS)
    $(GCC) $(CPP_OBJECTS) -o $@
%.o: %.cpp
    $(GCC) -c -MMD $< -o $@
-include $(DEP_FILES)
clean:
    rm $(CPP_OBJECTS) $(EXE)

此Makefile可以作为通用Makefile模板来编译C/C++项目,欢迎收藏

文章评论

热门栏目

马会一码爆料 确山县| 和林格尔县| 康平县| 河西区| 泸溪县| 图片| 商洛市| 罗源县| 乌拉特前旗| 西峡县| 徐汇区| 上栗县| 班戈县| 宝山区| 沐川县| 肃南| 交城县| 大渡口区| 神农架林区| 文昌市| 东港市| 宜宾市| 新昌县| 沧源| 罗源县| 万山特区| http://www.xafxmq.cn 通州市| 商水县| 抚远县| 乌海市| 宣汉县| 望奎县| 通城县| 泽库县| 台山市| 平罗县| 广宗县| 海晏县| 东城区| 潞城市| 黄平县| 永登县| 分宜县| 陇西县| 汨罗市| 邢台县| 金沙县| 重庆市| 北宁市| 炉霍县| 高尔夫| 安溪县| 瑞安市| 乐陵市| 丹江口市| http://xtcwLg.cn 和龙市| 卓资县| 聂拉木县| 沙坪坝区| 伊吾县| 方城县| 玉树县| 犍为县| 绵阳市| 华蓥市| 黔西县| 南城县| 勃利县| 当阳市| 宜春市| 中卫市| 皮山县| 苍南县| 连江县| 应城市| 宜春市| 莱阳市| 泉州市| 湾仔区| 鲁甸县| 台南市| 泾川县| 南岸区| 垣曲县| 新河县| 额尔古纳市| 集安市| 祁门县| 晴隆县| http://www.vgwucj.cn 南靖县| 武清区| 丁青县| 玉林市| 克什克腾旗| 辽宁省| 石嘴山市| 和龙市| 延吉市| 红桥区| 玛多县| 清新县| 兴安县| 马边| 孙吴县| 清原| 双鸭山市| 南丹县| 江陵县| 定兴县| 石台县| 寿光市| 枣强县| 公主岭市| 城市| 凤山县| 阜宁县| 瓮安县| 龙陵县| http://www.euqhkn.cn 涞水县| 西林县| 勃利县| 白城市| 泰安市| 荥阳市| 厦门市| 阿瓦提县| 胶州市| 开鲁县| 曲麻莱县| 清镇市| 资阳市| 台湾省| 东阿县| 岫岩| 延边| 台东市| 建昌县| 清丰县| 建瓯市| 丰城市| 樟树市| 上犹县| 千阳县| 汝南县| 鄂伦春自治旗| 若尔盖县| 通山县| http://btqgio.cn 岳阳市| 晋中市| 乌拉特前旗| 礼泉县| 武鸣县| 青冈县| 颍上县| 顺义区| 吴忠市| 武夷山市| 都江堰市| 灵丘县| 镶黄旗| 左权县| 图木舒克市| 阳高县| 塘沽区| 大埔县| 丰县| 白朗县| 揭阳市| 抚顺县| 桐柏县| 石嘴山市| 湖州市| 宁国市| 延寿县| 保德县| http://wpbgmt.cn 嘉峪关市| 万宁市| 宜春市| 河北省| 卢湾区| 稻城县| 汤原县| 抚顺市| 肥城市| 澄江县| 中牟县| 蒙城县| 长汀县| 瑞丽市| 家居| 弥渡县| 美姑县|