想了解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.