日期:2014-05-16  浏览次数:20634 次

FC6中Makefile使用VPATH无效?
根据此贴的问题:http://community.csdn.net/Expert/topic/5614/5614465.xml?temp=.8323328

这个朋友的回贴是:
 
      mymtom(mymtom)   (   )   信誉:100         Blog       加为好友     2007-6-24   17:43:31     得分:   50    
 
 
printf2.o   :   printf2.c  
        gcc   -c   printf2.c
这样写会造成gcc在当前目录下寻找printf2.c,   当然找不到了,改为下面这样就可以了.
printf2.o   :   printf2.c  
        gcc   -c   $ <

   
我的问题是:
但楼主不是指定了vpath路径了吗,如果当前目录找不到就会到sub目录去找。

如果还要写明$ <的话那vpath的作用是什么?


------解决方案--------------------
没想到我结贴了还有人拎出来问,支持一下。
这个问题我已经解决了
设置VPATH只作用在在依赖文件上,如果当前目录找不到就到VPATH下去找
ctest
|
|--hello.c
|--Makefile
|--printf2.h
|--sub
|--printf2.c
当运行如下命令时
printf2.o : printf2.c
gcc -c printf2.c
在ctest目录下gcc自然找不到printf2.c
但是printf2.o : printf2.c中,由于设置了VPATH=./sub,可以找到printf2.c文件

当程序printf2.o : printf2.c
gcc -c printf2.c
改为
printf2.o : printf2.c
gcc -c $ <
运行就可以了,我试过了,可能由于VPATH=./sub,运行时将$ <替换成./sub/printf2.c了吧,呵呵,反正可以正常运行了,哈哈
------解决方案--------------------
写printf2.c的话, 会被识别为全路径名, 所以在当前路径下找.
而用$ <的话, makefile会利用隐含规则进行查找VPATH. VPATH可以理解成是makefile的隐含变量, 只有使用makefile变量(如$ < $^等)时才会使用VPATH.
而printf2.c这样的文件名是没有这种特性的.