首页 > 编程语言 >c++_makefile

c++_makefile

时间:2022-11-29 00:12:30浏览次数:45  
标签:文件 OBJ TARGET CXX makefile c++ cpp main

关于四个version的思考,既然makefile的使用是为了便捷,从刚开始第一个简版的makefile有什么用,到第二版可以用依赖来抽象出1 $(TARGET)和$(OBJ)之间的关系 2 .o .cpp之间的关系,再到version3可以去用.o .cpp去模块化单独写每一个.o和.cpp文件之间关系这一步。

但是version4用了一个SRC集成了所有的.cpp文件,这样在.cpp文件增加的时候不需要额外写东西,直接就能继续重新编译。

Makefile make 有什么用呢

按照Makefile中给定的语法去帮助我们编译多个文件

make命令会根据是否更改了这个文件,决定要不要编译它,或者根据根据之前的编译结果直接链接

可以指定用什么编译 $(CXX) e.g.(g++),需要说明依赖关系

make 命令默认找到 Makefile去g++文件

不然指定make -f (Makefile)

比如Makefile现在内容是

Makefile

hello: main.cpp printhello.cpp factorial.cpp

​ g++ -o hello main.cpp printhello.cpp factorial.cpp

注意此处的g++前为tab,不能为space,因为tab告诉文件这个Makefile执行什么

当编译的文件很多时很麻烦,所以升级为version2

CXX : g++

TARGET : hello

OBJ = main.o printhello.o factorial.o

下面这行命令在说,TARGET依赖于这些OBJ文件

$(TARGET) : $(OBJ)

​ $(CXX) -o $(TARGET) $(OBJ)

main.o printhello.o factorial.o的依赖是这么来的

main.o: main.cpp

​ $(CXX) -c main.cpp

printhello.o: printhello.cpp

​ $(CXX) -c printhello.cpp

factorial.o: factorial.cpp

​ $(CXX) -c factorial.cpp

小结:version2中其实就是指定了依赖关系,我们的TARGET是生成hello,然后hello并不存在,就需要生成它,生成它依赖于OBJ,我们通过给出几个OBJ去查看OBJ又是依赖什么。

make命令会根据是否更改了这个文件,决定要不要编译它,或者根据根据之前的编译结果直接链接

常用命令:

rm *.o(删去当前生成的所有.o文件)

ll(列出当前的所有文件)

$@, $<, $^, 还有SRC这种

version3和4懒得说明了

CXX = g++

TARGET =hello

OBJ = main.o printhello.o factorial.o

Wall 代表Warnings全部表示

CXXFlAGS = -c Wall

$(TARGET) : $(OBJ)

​ $(CXX) -o $@ $^

前面表示了三个.o文件是怎么来的,现在可以统一写成每个cpp文件都从o里面来

%.o %.cpp

​ $(CXX) $(CXXFLAGS) $< -o $@

防止存在一个叫clean的文件,因为已经有了就不需要生成了。而.PHONY依赖于clean,永远不会存在一个叫做.PHONY的文件,就一定会运行clean

.PHONY: clean

clean:

​ rm -f *.o $(TARGET)

version4:

CXX = g++

TARGET =hello

SRC = $(wildcard *.cpp)

OBJ = $(patsubst %.cpp, %.o, $(SRC))

CXXFlAGS = -c Wall

$(TARGET) : $(OBJ)

​ $(CXX) -o $@ $^

%.o %.cpp

​ $(CXX) $(CXXFLAGS) $< -o $@

标签:文件,OBJ,TARGET,CXX,makefile,c++,cpp,main
From: https://www.cnblogs.com/hxjiang/p/16934217.html

相关文章

  • Swift 2023:强调并发、泛型和 C++ 互操作性,开发 Swift 解析器
    AppleSwift团队的一名工程师兼语言工作组成员JohnMcCall在最新发布的一篇博客中介绍了Swift的2023年度计划。“Swift项目中有很多激动人心的工作正在进行,而且很......
  • C++学习------cmath头文件的源码学习06
    函数族定义---双曲函数cosh---计算双曲余弦函数sinh---计算双曲正弦函数tanh---计算双曲正切函数acosh---计算双曲余弦面积asinh---计算双曲正弦面积atanh---计算双曲正切面......
  • C++引用和指针
    1、有时候要想搞清楚一条赋值语句到底是改变了指针的值还是改变了指针所指对象的值不太容易,最好的办法就是记住赋值永远改变的等号左边的对象,例如:*p=0,改变的是p所指对象的......
  • C++ 类this及返回自身对象的引用方式
    这篇文章主要介绍了C++ 类this及返回自身对象的引用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 +目录this及返回自身对象......
  • C++ 之 宏定义
      宏在C语言中非常重要,但在C++中却无甚大用,普遍的共识:尽量避免使用宏  C++之父Bjarne在《C++ProgrammingLanguage》中写到Avoidmacros   《Eff......
  • C++11:lambda匿名函数
    lambda源自希腊字母表中第11位的λ,在计算机科学领域,它则被用来表示一种匿名函数。所谓匿名函数,简单地理解就是没有名称的函数,又常被称为lambda函数或者lambda表达......
  • C++中的几种构造函数和析构函数
    本篇文章,我们来了解一下C++中的几种构造函数,以及析构函数#include<format>#include<iostream>#include<string>usingstd::format;usingstd::cout;usingstd::......
  • 【c++】map用法详解
    【c++】map用法详解LeeMooq已于2022-05-0122:01:43修改21398收藏46分类专栏:c++学习文章标签:c++版权c++学习专栏收录该内容5篇文章3订阅订阅专栏map是c++标准......
  • python grammar、C/C++ Python Parsing Engine
    pythongrammar、C/C++PythonParsingEnginecatalog1.Python语言简介2.Python模块3.嵌入式Python解析引擎:C++调用Python4.Python调用C(b......
  • C++ 进程间通信
    https://blog.csdn.net/weixin_38416696/article/details/90719388一,C++常用进程间通信管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖......