0
点赞
收藏
分享

微信扫一扫

Makefile 入门

一、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)
举报

相关推荐

0 条评论