学写Makefile

Makefile Tutorial By Example这个网站的内容挺全的,主要是根据lab_intro的Makefile这个例子来理解,在理解的基础上把mp的Makefile给写了。

Makefile的用处

Makefiles are used to help decide which parts of a large program need to be recompiled. In the vast majority of cases, C or C++ files are compiled. Other languages typically have their own tools that serve a similar purpose as Make. Make can also be used beyond compilation too, when you need a series of instructions to run depending on what files have changed. This tutorial will focus on the C/C++ compilation use case.

我觉得还蛮好理解的,就比如说我们的程序是有很多个子程序组成的(有很多个cpp),然后我们通过main函数来把这些程序给组织起来,当我们修改这其中的某一个或某几个cpp的时候,只要make一下,就可以让这些程序重新编译成.o了,不需要我们一个一个重新在命令行来完成这样的操作。

lab_intro的Makefile文件

EXENAME = lab_intro #需要make的是什么文件?
OBJS = main.o PNG.o HSLAPixel.o lodepng.o lab_intro.o #make完后有哪些文件?

CXX = g++ 
CXXFLAGS = -std=c++1y -c -g -00 -Wall -Wextra -pedantic
LD = g++
LDFLAGS = -std=c++1y -lpng -lphthread -lm
#不知道,,,但是感觉可以直接照搬

$(EXENAME) : $(OBJS)
	$(LD) $(OBJS) $(LDFLAGS) -o $(EXENAME)#也是直接照搬

#OBJS
main.o : main.cpp lab_intro.h cs225/PNG.h cs225/HSLAPixel.h 
#.o的写法就是看.cpp里面有哪些.cpp和.h
	$(CXX) $(CXXFLAGS) main.cpp 

lab_intro.o : lab_intro.cpp lab_intro.h
	$(CXX) $(CXXFLAGS) lab_intro.cpp
	
PNG.o : cs225/PNG.cpp cs225/PNG.h cs225/HSLAPixel.h cs225/lodepng/lodepng.h
	$(CXX) $(CXXFLAGS) cs225/PNG.cpp

HSLAPixel.o : cs225/HSLAPixel.cpp cs225/HSLAPixel.h
	$(CXX) $(CXXFLAGS) cs225/HSLAPixel.cpp

lodepng.o : cs225/lodepng/lodepng.cpp cs225/lodepng/lodepng.h
	$(CXX) $(CXXFLAGS) cs225/lodepng/lodepng.cpp

#之后的test又有了些变化,因为是用来检验程序是否通过测试的,和之前的编译是两回事吧。
test: basic.o PNG.o HSLAPixel.o lodepng.o lab_intro.o
	$(LD) basic.o PNG.o HSLAPixel.o lodepng.o lab_intro.o $(LDFLAGS) -o test

basic.o : tests/basic.cpp tests/catch.hpp
	$(CXX) $(CXXFLAGS) tests/basic.cpp

#clean
clean :
	-rm -f *.o $(EXENAME) test #这个感觉也可以照搬。

没学习前就像上面这样(捂脸),从注释就可以看出我的无助。。。

Makefile Tutorial的学习

1.
  • CC: Program for compiling C programs; default cc
  • CXX: Program for compiling C++ programs; default g++
  • CFLAGS: Extra flags to give to the C compiler
  • CXXFLAGS: Extra flags to give to the C++ compiler
  • CPPFLAGS: Extra flags to give to the C preprocessor
  • LDFLAGS: Extra flags to give to compilers when they are supposed to invoke the linker

因为写的是C++,所以Makefile自然用的是CXX,CXXFLAGS,不过没有介绍LD,,,只介绍了LDFLAGS,也没具体解释flags是什么意思,唉。

2.

Compiling a C++ program: n.o is made automatically from n.cc or n.cpp with a command of the form $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $^ -o $@

感觉上面的代码是有省略的,只是$(CXX) $(CXXFLAGS) .cpp,不过.o文件冒号后面的一堆我是没有搞懂的,不知道为什么是这些——这点可以看3。

3.

也就是说先运行other_file的命令,然后再运行some_file的命令,知道了这点的话,就可以理解冒号后面的含义了。

然后的话也是成功地把mp的Makefile给写了出来(照猫画虎)。

你可能感兴趣的:(大学专业,学习,笔记,linux,c++)