2013-12-21 22 views
1

我有一個用於C項目的Makefile。我有一個目錄中的src,這個目錄在src的子目錄中有一些源代碼。包含在包含目錄src中。C makefile RE:建立依賴關係以在各自目錄中正確查找對象

在Makefile中,我用下面生成的.C源文件的依賴性信息:

%.o: %.c 
    CFLAGS="$(CFLAGS)" 
    $(CC) -c $(CFLAGS) $(STACK_OPTS) $(SIO_FLAGS) $(IO_FLAGS) $(LOCAL_INCLUDES) -DSYNC_WRITE $< 
    $(CC) -MM $(CFLAGS) $(LOCAL_INCLUDES) $^ > $*.d 
    @cp -f $*.d $*.d.tmp 
    @sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \ 
     sed -e 's/^ *//' -e 's/$$/:/' >> $*.d 
    @rm -f $*.d.tmp 

這工作得很好......但是,我發現是,這些源文件在src的子目錄中,它們的.d和.o文件存放在主src目錄INSTEAD中,讓它們放入源文件所在的目錄中。

我已經玩過宏$(< D),試圖存儲對象(.o)和依賴項文件(.d),將目錄名添加到它們應該在的位置,但是當鏈接階段發生時,它不是找不到這個目錄中的文件。

我有一個名爲VPATH的目錄。

關於我在這裏失蹤的想法?

+0

希望我知道如何幫助你。 「Make」對我來說是一種黑色藝術。一個建議:任何時候我不得不用'make'做些什麼,它總是幫助我正確地知道**如何使'gcc'按照我想要從命令行首先執行的操作。然後我在makefile上工作。祝你好運。 – kmort

+0

好的,進度,我用vpath(小寫)指定在哪裏查找源文件,包括AND已忘記包含一個單獨的目標文件組:使用: -include $(MYOBJS:.o = .d) 現在,它發現它實際存在的東西... 在鏈接階段gcc沒有找到子目錄中的對象...所以...有沒有一個vpath相當於?我想這裏應該發生什麼是對象文件應該重寫時,該對象實際上是在一個子目錄中找到。 – user3053087

+0

我相信問題是在TARGETS構建規則中使用自動var $ ^。有沒有一些魔術讓巫術在這裏強制它查看vpath目錄中對象文件實際的位置? – user3053087

回答

1

默認情況下,VPATH會將所有目標放入當前工作目錄。 VPATH的標準使用是一種模式,其中您只有一個只讀的源目錄,並且您想要在其他位置構建對象;例如你需要用不同的標誌或者其他東西來編譯多次。然後,將對象目錄設置爲當前目錄,然後運行makefile,以便使用VPATH查找源代碼。

如果您希望目標與先決條件位於同一目錄中,則可以將GPATH用於您的VPATH使用;詳情請查閱GNU make手冊。

+0

我剛剛嘗試設置GPATH ...仍然炸燬建設目標。奇怪的是,如果我再次運行make,它會更進一步。因此,目標規則中的$ ^似乎沒有正確使用擴展/目錄查找來指示VPATH表示它們應該在哪裏。 – user3053087

+0

我認爲什麼是foobarring TARGET規則是我在規則中使用$( user3053087

+0

正確。你幾乎從不想寫一個不像make認爲應該創建目標文件那樣創建目標文件的配方,它是'$ @'。如果你使用GPATH,那麼'$ @'將保留vpath找到的目錄,你不需要改變它。 – MadScientist