博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
makefile中“模式规则“的引入和介绍------%:%.cpp
阅读量:4142 次
发布时间:2019-05-25

本文共 3028 字,大约阅读时间需要 10 分钟。

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

 

test1: test1.cpptest2: test2.cpptest3: test3.cppclean:	rm -f test1 test2 test3

       编译一下:

 

 

taoge@localhost Desktop>  makeg++     test1.cpp   -o test1taoge@localhost Desktop>

        可见, 只编译了test1.cpp,  没有达到效果。  为什么呢? 因为执行make命令时, 认为第一个test1是最终的目标文件, 且三个cpp文件确实相互独立, 所以不会触发test2和test3对应执行。

 

      

         那改一下:

 

test1 test2 test3: test1.cpp test2.cpp test3.cppclean:	rm -f test1 test2 test3

        结果:

 

 

taoge@localhost Desktop>  makeg++     test1.cpp test2.cpp test3.cpp   -o test1/tmp/ccAX6NNB.o: In function `main':test2.cpp:(.text+0x72): multiple definition of `main'/tmp/ccaITY1Z.o:test1.cpp:(.text+0x72): first defined here/tmp/cc4Wsk9m.o: In function `main':test3.cpp:(.text+0x72): multiple definition of `main'/tmp/ccaITY1Z.o:test1.cpp:(.text+0x72): first defined herecollect2: ld returned 1 exit statusmake: *** [test1] Error 1taoge@localhost Desktop>

       显然不行啊, 怎么能对三个独立的cpp文件进行杂糅链接呢?

 

 

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

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

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

 

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

 

all: test1 test2 test3test1: test1.cpptest2: test2.cpptest3: test3.cppclean:	rm -f test1 test2 test3

        执行一下(如下用make命令也可以):

 

 

taoge@localhost Desktop>  make cleanrm -f test1 test2 test3taoge@localhost Desktop>  make allg++ test1.cpp -o test1g++ test2.cpp -o test2g++ test3.cpp -o test3taoge@localhost Desktop>  lsmakefile  test1  test1.cpp  test2  test2.cpp  test3  test3.cpptaoge@localhost Desktop>

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

 

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

 

all: test1 test2 test3	@echo testingtest1: test1.cpptest2: test2.cpptest3: test3.cppclean:	rm -f test1 test2 test3

          结果为(如下用make命令也可以):

 

 

taoge@localhost Desktop>  make allg++     test1.cpp   -o test1g++     test2.cpp   -o test2g++     test3.cpp   -o test3testingtaoge@localhost Desktop>

         可见, 如果all后有命令, 也会被执行哈。

 

 

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

 

all: test1 test2 test3%:%.cpp	g++ $< -o $@clean:	rm -f test1 test2 test3

        结果(如下用make命令也可以):

 

 

taoge@localhost Desktop>  make cleanrm -f test1 test2 test3taoge@localhost Desktop>  make allg++ test1.cpp -o test1g++ test2.cpp -o test2g++ test3.cpp -o test3taoge@localhost Desktop>

        %是通配的,看看如下这两句:

 

 

%:%.cpp	g++ $< -o $@

        意思是把所有的cpp文件, 都编译成对应的最终文件。 无需都解释了吧(当然, 你得了解$<和$@)。

 

 

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

 

CPPLIST = $(wildcard *.cpp)    # get cpp file listTARGET = $(patsubst %.cpp, %, $(CPPLIST)) # get corresponding target fileall: $(TARGET)	@echo ------------------	@echo log1: $(TARGET)	@echo log2: $(CPPLIST)%:%.cpp	g++ $< -o $@	clean:	rm -f $(TARGET)

         看下结果(如下用make命令也可以):

 

 

taoge@localhost Desktop>  make cleanrm -f  test1  test2  test3 taoge@localhost Desktop>  make allg++ test1.cpp -o test1g++ test2.cpp -o test2g++ test3.cpp -o test3------------------------log1: test1 test2 test3log2: test1.cpp test2.cpp test3.cpptaoge@localhost Desktop>

        搞定。

 

 

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

 

%:%.cpp	g++ $< -o $@

       其实, 这个还是很好理解的。 

 

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

 

 

转载地址:http://lggvi.baihongyu.com/

你可能感兴趣的文章
1060 Are They Equal (25 分)
查看>>
83. Remove Duplicates from Sorted List(easy)
查看>>
88. Merge Sorted Array(easy)
查看>>
leetcode刷题191 位1的个数 Number of 1 Bits(简单) Python Java
查看>>
leetcode刷题198 打家劫舍 House Robber(简单) Python Java
查看>>
NG深度学习第一门课作业2 通过一个隐藏层的神经网络来做平面数据的分类
查看>>
leetcode刷题234 回文链表 Palindrome Linked List(简单) Python Java
查看>>
NG深度学习第二门课作业1-1 深度学习的实践
查看>>
Ubuntu下安装Qt
查看>>
Qt札记
查看>>
我的vimrc和gvimrc配置
查看>>
hdu 4280
查看>>
禁止使用类的copy构造函数和赋值操作符
查看>>
C++学习路线
查看>>
私有构造函数
查看>>
组队总结
查看>>
TitledBorder 设置JPanel边框
查看>>
DBCP——开源组件 的使用
查看>>
抓包工具
查看>>
海量数据相似度计算之simhash和海明距离
查看>>