一、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 即可; 我们在构建我们的目标的时候,必须要把其他依赖的目标先构建出来;
目标(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