想了解make/makefile的人, 肯定对gcc或者g++有所了解。 比如, 我们写了一个main.cpp文件, 可以用g++把main.cpp编译为可执行程序main, 其实, 就是g++这个命令对main.cpp文件进行操作而已。 而当我们执行make命令时, 其实是make这个命令对makefile文件进行操作, 仅此而已。 然而, 一说到make/makefile , 大家就会本能地想到编译, 其实, 这并不是make/makefile的全部。

        make/makefile的本质是: make是一个linux命令, makefile是一个文件。 make读取makefile中的内容, 并根据makefile中的内容, 来执行对应的操作。

        我想, 对于任何事情而言, 最重要的是搞清本质, 至于其他的东西, 都好说。

 

        make是linux下的一个固定命令, 不用过分关注, 重要的是知道makefile该如何定义能被make命令执行的操作。 一起来看看吧(如下是makefile文件中的内容):

 

oh:
	@echo "log 111"

my:xxx
	@echo "log 222"

god:
	@echo "log 333"

 

      我们顺便来执行一下make命令:

 

xxxxxx:~/learnmk> ls
makefile 
xxxxxx:~/learnmk> make
log 111
xxxxxx:~/learnmk> make oh
log 111
xxxxxx:~/learnmk> make xxx
make: *** No rule to make target `xxx'.  Stop.
xxxxxx:~/learnmk> make god
log 333
xxxxxx:~/learnmk> 

 

       make命令读取makefile后, 找到第一个标识, 也就是oh, 然后执行对应的操作, 打印log 111.  注意:make会默认找makefile文件的第一个标识。

       make oh是显式置地执行oh对应的操作,  打印log 111

       make my执行操作时候, 需要依赖于xxx,  但makefile中找不到xxx依赖, 所以有问题。

       make god的时候, 执行god对应的操作, 打印log 333

 

       部分初学者对make all很纳闷, all是什么呢, all实际上就跟上面的oh, my, god类似, 是一个东西, 只不过是名称不同而已, 我们来看看:

 

all:
	@echo "log 111"

lib:xxx
	@echo "log 222"

bin:
	@echo "log 333"

        执行以下make命令, 如下:

 

 

xxxxxx:~/learnmk> ls
makefile 
xxxxxx:~/learnmk> make
log 111
xxxxxx:~/learnmk> make all
log 111
xxxxxx:~/learnmk> make lib
make: *** No rule to make target `xxx', needed by `lib'.  Stop.
xxxxxx:~/learnmk> make bin
log 333
xxxxxx:~/learnmk>


      

 

       话不多说, 我们来看看如何使用make/makefile批量地把.cpp文件改成.txt文件:

 

CPPLIST = $(wildcard *.cpp)                     # 获取当前目录的cpp文件名列表
TARGET = $(patsubst %.cpp, %.txt, $(CPPLIST))   # 获取对应的txt文件名列表

all: $(TARGET)
	@echo ------------------

# 有点for循环的感觉哈
%.txt:%.cpp
	cp $< $@

clean:
	rm -f $(TARGET)

debug:
	@echo $(CPPLIST)
	@echo $(TARGET)

       来执行一下:

 

 

xxxxxx:~/learnmk> ls
1.cpp  2.cpp  makefile
xxxxxx:~/learnmk> make debug
1.cpp 2.cpp
1.txt 2.txt
xxxxxx:~/learnmk> make all
cp 1.cpp 1.txt
cp 2.cpp 2.txt
------------------
xxxxxx:~/learnmk> ls
1.cpp  1.txt  2.cpp  2.txt  makefile
xxxxxx:~/learnmk> md5sum *
3bef1ab9a9eb2581bef21d07367d61b8  1.cpp
3bef1ab9a9eb2581bef21d07367d61b8  1.txt
25ab5137b85a1522b801828dc447b1de  2.cpp
25ab5137b85a1522b801828dc447b1de  2.txt
80c4ba7317d77850ebd818cebb29b393  makefile
xxxxxx:~/learnmk> make clean
rm -f  1.txt  2.txt   
xxxxxx:~/learnmk> ls
1.cpp  2.cpp  makefile
xxxxxx:~/learnmk> 

        搞定, make/makefile就这么easy.

 

 

 

 


本文转载:CSDN博客