300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > makefile中模式规则的引入和介绍------%:%.cpp

makefile中模式规则的引入和介绍------%:%.cpp

时间:2023-01-27 02:38:08

相关推荐

makefile中模式规则的引入和介绍------%:%.cpp

原文地址:/stpeace/article/details/53054679

目录下有test1.cpp,test2.cpp, test3.cpp三个独立文件(彼此之间并无依赖与调用关系), 要编译成三个可执行程序, 怎么搞呢? 我们看看makefile:

[plain]view plain copy test1:test1.cpptest2:test2.cpptest3:test3.cppclean:rm-ftest1test2test3编译一下:[plain]view plain copy taoge@localhostDesktop>makeg++test1.cpp-otest1taoge@localhostDesktop>可见, 只编译了test1.cpp, 没有达到效果。 为什么呢? 因为执行make命令时, 认为第一个test1是最终的目标文件, 且三个cpp文件确实相互独立, 所以不会触发test2和test3对应执行。

那改一下:

[plain]view plain copy test1test2test3:test1.cpptest2.cpptest3.cppclean:rm-ftest1test2test3结果:[plain]view plain copy taoge@localhostDesktop>makeg++test1.cpptest2.cpptest3.cpp-otest1/tmp/ccAX6NNB.o:Infunction`main':test2.cpp:(.text+0x72):multipledefinitionof`main'/tmp/ccaITY1Z.o:test1.cpp:(.text+0x72):firstdefinedhere/tmp/cc4Wsk9m.o:Infunction`main':test3.cpp:(.text+0x72):multipledefinitionof`main'/tmp/ccaITY1Z.o:test1.cpp:(.text+0x72):firstdefinedherecollect2:ldreturned1exitstatusmake:***[test1]Error1taoge@localhostDesktop>显然不行啊, 怎么能对三个独立的cpp文件进行杂糅链接呢?

那怎么办? 我们反思一下上面的两次失败:

在前一次中, 我们其实只定义了一个target文件(因cpp独立), 也就是test1.

在后一次中, 我们定义了三个target文件, 可是, 杂糅链接了(依赖关系杂糅)。

那好, 我们来改进一下, 兼顾到上面两种情况:

[plain]view plain copy all:test1test2test3test1:test1.cpptest2:test2.cpptest3:test3.cppclean:rm-ftest1test2test3执行一下(如下用make命令也可以):[plain]view plain copy taoge@localhostDesktop>makecleanrm-ftest1test2test3taoge@localhostDesktop>makeallg++test1.cpp-otest1g++test2.cpp-otest2g++test3.cpp-otest3taoge@localhostDesktop>lsmakefiletest1test1.cpptest2test2.cpptest3test3.cpptaoge@localhostDesktop>

我们思考一下, 为什么这样可以? make命令首先找到all标志, 发现了必须要生成test1, test2, test3, 于是就往下找, 去生成他们, 于是就达到了我们的目标。

这里有个疑问, 为什么没有生成all文件呢? 因为all下面并没有待执行的命令,也无法自动推导。 我们来看看改动的makefile:

[plain]view plain copy all:test1test2test3@echotestingtest1:test1.cpptest2:test2.cpptest3:test3.cppclean:rm-ftest1test2test3 结果为(如下用make命令也可以):[plain]view plain copy taoge@localhostDesktop>makeallg++test1.cpp-otest1g++test2.cpp-otest2g++test3.cpp-otest3testingtaoge@localhostDesktop>可见, 如果all后有命令, 也会被执行哈。

以上部分应该比较好动, 现在还有个问题, 如果有100个cpp文件, 那该怎么搞起呢? 写到test100? 麻烦死了, 明显不符合计算机的思维, 好, 那就搞个模式规则吧, 如下:

[plain]view plain copy all:test1test2test3%:%.cppg++$<-o$@clean:rm-ftest1test2test3结果(如下用make命令也可以):[plain]view plain copy taoge@localhostDesktop>makecleanrm-ftest1test2test3taoge@localhostDesktop>makeallg++test1.cpp-otest1g++test2.cpp-otest2g++test3.cpp-otest3taoge@localhostDesktop>%是通配的,看看如下这两句:[plain]view plain copy %:%.cppg++$<-o$@意思是把所有的cpp文件, 都编译成对应的最终文件。 无需都解释了吧(当然, 你得了解$<和$@)。

其实, 如上程序还没有解决根本问题, 继续优化吧:

[plain]view plain copy CPPLIST=$(wildcard*.cpp)#getcppfilelistTARGET=$(patsubst%.cpp,%,$(CPPLIST))#getcorrespondingtargetfileall:$(TARGET)@echo------------------@echolog1:$(TARGET)@echolog2:$(CPPLIST)%:%.cppg++$<-o$@clean:rm-f$(TARGET)看下结果(如下用make命令也可以):[plain]view plain copy taoge@localhostDesktop>makecleanrm-ftest1test2test3taoge@localhostDesktop>makeallg++test1.cpp-otest1g++test2.cpp-otest2g++test3.cpp-otest3------------------------log1:test1test2test3log2:test1.cpptest2.cpptest3.cpptaoge@localhostDesktop>搞定。

本文所谓的模式规则, 其实就是:

[plain]view plain copy %:%.cppg++$<-o$@其实, 这个还是很好理解的。

最后想说一下, 有点循环的感觉啊!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。