首页 > 其他分享 >Makefile 入门

Makefile 入门

时间:2023-10-27 18:32:28浏览次数:31  
标签:入门 .. Makefile 编译 manager cpp test

一、Makefile简介

什么是Makefile?很多做windows的程序员可能都没有接触过,因为windows的很多开发环境中都已经帮你做了这些事情,一键编译构建即可;但是要对工程的编译、链接、构建有一个专业的认识,或者要在linux上编程的话,就需要了解Makefile了。 Makefile,人称“工程管理器”,它的作用主要是用来在我们的工作管理中指定一系列规则,规定我们哪些文件需要优先编译,哪些文件需要后编译,哪些文件需要重新编译。对于一个team来说,我们做一个项目,每个人负责一部分工作;当我们所有人写的程序放在一起编译的时候,我们就要确定哪些文件先编译,哪些后编译。 本文默认使用的是我们的LINUX系统下的G++编译器。

二、CMakeLists.txt介绍

CMakeLists编写有自己的一套语法,可读性强与Makefile文件, 程序员比较能上手;CMakeLists语言也是进一步转化为makefile,再进行项目的编译、链接和构建。

三、C/C++编译链介绍

首先我们来回忆一下,C/C++语言的编译流程,==预处理--》编译--》汇编--》链接==。

  • 预处理:对我们的头文件的处理及分析;
  • 编译:把我们的C语言转换成我们的汇编语言,并且检查我们C语言的语法错误;
  • 汇编:把我们的汇编代码转换成目标文件;
  • 链接:链接我们所需要的库文件(例如:C库),生成可执行的代码;

预处理,编译,汇编这几个阶段主要是生成我们的目标文件(.o),这就是我们所说的编译过程。链接过程,根据我们不同的需求,产生不同的文件,例如:我们要生成我们的可执行代码(a.out)或者我们的自定义可文件(a.so)等。 我们在写Makefile的时候,一般会把汇编和链接,这两个步骤在执行汇编步骤的时候执行一遍。

四、Makefile的编写介绍

在我们的Makefile中第一个重要的概念就是目标(target)。顾名思义,我们make的使用,要寻找目标,在下图就是all, test。目标放在":"之前,由字母和“_"组成。

all:
	echo "Hello world"
test:
	echo "Just do it"

如果我们不想把Makefile里的内容打印出来,并且要同时运行all和test,即可写成下图:

all: test 
	@echo "Hello world"
test:
	@echo "Just do it"

然后运行make 即可; image.png 我们在构建我们的目标的时候,必须要把其他依赖的目标先构建出来;

目标(target): 先决条件(prerequisites)
<TAB键> 命令

五、工作案例(带参数的Makefile)

## use g++ compiler
CXX = g++
CXXFLAGS += -Wall -std=c++11 -g -O2

## add define macro
CXXFLAGS += -DDEBUG_PRINTF
CXXFLAGS += -DDEBUG_READ
CXXFLAGS += -DDEBUG_WRITE

## define params
LIBS += -lpthread
HEADERS = ../../shared_mem_manager.hpp ../../ring_buffer.hpp
SRCS = my_thread_test.cpp ../../shared_mem_manager.cpp ../../ring_buffer_on_shmem.cpp
OBJECTS = my_thread_test.o ../../shared_mem_manager.o ../../ring_buffer_on_shmem.o 
TARGET = my_thread_test

all: $(TARGET)

$(TARGET) : ${OBJECTS} 
	$(CXX) ${CXXFLAGS} -o $(TARGET)  ${OBJECTS} ${LIBS}

## compiler process 写法一
my_thread_test.o: my_thread_test.cpp
	${CXX} ${CXXFLAGS} -c my_thread_test.cpp -o my_thread_test.o

../../shared_mem_manager.o : ../../shared_mem_manager.cpp
	$(CXX) ${CXXFLAGS} -c  ../../shared_mem_manager.cpp -o ../../shared_mem_manager.o 

../../ring_buffer_on_shmem.o : ../../ring_buffer_on_shmem.cpp
	$(CXX) ${CXXFLAGS} -c ../../ring_buffer_on_shmem.cpp -o ../../ring_buffer_on_shmem.o

##compiler process 写法二
### not recommend!!!
my_thread_test.o : ../../shared_mem_manager.hpp ../../ring_buffer.hpp ../../shared_mem_manager.cpp ../../ring_buffer_on_shmem.cpp

##make clean
clean :
	rm -f $(OBJECTS) $(TARGET)

标签:入门,..,Makefile,编译,manager,cpp,test
From: https://blog.51cto.com/u_15804342/8062054

相关文章

  • MapillaryVistas数据集入门
    MapillaryVistas数据集入门在计算机视觉领域,数据集是进行算法研究和模型训练的重要基础。本文将介绍MapillaryVistas数据集,该数据集是一个大规模的街景图像数据集,可以用于场景理解、语义分割等任务。什么是MapillaryVistas数据集?MapillaryVistas数据集由Mapillary公司收集和发布,是......
  • 【Java集合】了解集合的框架体系结构及常用实现类,从入门到精通!
    前言通过Java基础的学习,我们掌握了主要的Java语言基本的语法,同时了解学习了Java语言的核心-面向对象编程思想。从集合框架开始,也就是进入了java这些基础知识及面向对象思想进入实际应用编码的过程,通过jdk中集合这部分代码的阅读学习,就能发现这一点。本计划在这篇中把框架体系和......
  • 正则快速入门
    1.标识 2.匹配规则  3.连续匹配规则a)多个规则可以连续书写,用以匹配多个字符,例如:  /\d[a-zA-Z]///匹配以1个数字紧跟一个字母b)若多个规则是一个或者的关系,使用|分割/\d[a-zA-Z]|[a-zA-Z]\d///匹配以1个数字紧跟一个字母,或者一个字母......
  • [node]package入门---简单记录,日后补充
    参考:package入门:https://cloud.tencent.com/developer/article/1195063npm i 添加包:https://www.cnblogs.com/it-wwp/p/16719235.htmlnpm i 删除包:https://blog.csdn.net/m0_46149348/article/details/1308622181. 安装node.js自行百度,不作说明。 如果本地安装速度太慢,切......
  • C#入门:如何合理制定方法参数-下
    在上一篇中:https://www.cnblogs.com/kevin-Y/p/17792071.html我们将程序组成为三个主要对象:字段、查询范围、行为控制器。字段、查询范围都是数据,都分别对应一个类,有各自属性,并能保存和读取行为控制器则是一个接口,有N种实现类,每一种类型的字段就有一种实现类publicinterf......
  • Java零基础入门-包装类
    前言Java是一种广泛使用的面向对象编程语言,它通过JVM(Java虚拟机)来实现跨平台。如果您刚刚开始学习Java编程语言,那么您可能会发现Java中的包装类是一个挑战。本文将对Java中的包装类进行详细介绍,以帮助您更好地理解Java编程语言。摘要在Java编程语言中,包装类用于将基本数据类型转......
  • 软件测试入门基础知识点
    一、软件测试认识软件及测试软件:软件是控制硬件工作的工具。操作系统也是软件。软件测试:使用技术手段验证软件是否满足使用需求。软件测试目的:减少软件缺陷(bug),保障软件质量。测试主流技能功能测试:主要验证程序的功能是否满足需求。自动化测试:使用代码或工具......
  • C#入门:如何合理制定方法参数
    1、利用面向对象的原则,将我们面对的功能拆分出相关类2、相同功能只应出现在一个类中。3、相似功能尽量提取其公共部分总的目标可以简化为精减代码量。我们以一个动态条件查询界面来说明一下上面几点 这是一个病案查询功能,左则的列表是所有可供选择的字段,中间是用户要求查询......
  • Android入门教程 | RecyclerView使用入门
    想必大家对列表的表现形式已经不再陌生。手机上有联系人列表,文件列表,短信列表等等。本文讲述的是在Android开发中用RecyclerView来实现列表效果。使用步骤引入RecyclerView在app的build.gradle文件中添加引用。我们使用的是androidx包。gradle:dependencies{//........
  • 自监督学习入门
    自监督学习入门声明本片文章主要介绍了自监督学习在预训练中的主要应用。许多内容非笔者原创,感谢以下作者对本篇文章的启发和指导。欢迎读者进行留言和讨论自监督学习——有趣的预训练模型设计Self-supervisedLearning再次入门自监督学习:人工智能的未来1、背景为什么自......