2013-11-03 41 views
-1

我正在看一個Makefile來找出我的問題。我的問題是編譯中包含兩個目錄,它們的Fortran源文件名稱完全相同,編譯本身如何決定使用哪個源文件。至於我的情況,這兩個目錄是/ dir1 /和/ dir2 /。兩者都有一個名爲test.F90文件的Fortran文件,並且這兩個目錄都包含在包含目錄中。那麼爲什麼編譯/dir1/test.F90而不是/dir2/test.F90。 Makefile的代碼片段是真正的編譯編譯過程如何選擇正確的源文件?

SOURCES := $(shell cat Srcfiles) 
OBJS := $(addsuffix .o, $(basename $(SOURCES))) 

.F90.o: 
    $(FC) -c $(INCLDIR) $(INCS) $(FFLAGS) $(FREEFLAGS) $< 

部分看起來像:

mpif90 -c -I/dir1/ -I/dir2 ... /dir1/test.F90 
在Srcfiles

,還有所有Fortran文件的列表作爲

test.F90 
test1.F90 
... 

還有一個名爲Filepath的文件,它列出文件目錄爲

/dir1/ 
/dir2/ 
/dir3/ 

我提供儘可能多的,我認爲與我的問題有關,你能指出方向如何解決我的問題?

+0

'INCLDIR'是如何形成的?另外,目前還不清楚構建目標的規則是什麼,即需要哪些目標文件。那只是'OBJS'? (我懷疑這一點。) – Inspired

+1

*「我提供的數據與我的問題相關的數量一樣多......」*顯然你沒有提供足夠的數據。請發佈整個makefile。你想知道Make如何選擇'dir1/test.F90',或者如何讓Make使用'dir2/test.F90'? – Beta

回答

2

該makefile從名爲xxx.F90的文件構建名爲xxx.o的文件。 xxx可以是一個簡單的文件名,或者它可以是一個路徑名;沒關係。

該生成文件從Srcfiles文件(通過cat)獲取要生成的文件列表。所以,在你Srcfiles文件您列出/dir1/test.F90,這意味着該OBJS變量包含/dir1/test.o,然後你問make來構建/dir1/test.o它將從源文件/dir1/test.F90編譯。

如果您將/dir2/test.F90放入您的Srcfiles文件中,那麼它會將其編譯爲/dir2/test.o

+0

嗨,謝謝,但似乎你不明白我的問題。在Srcfiles中只有test.F90文件名,編譯時只編譯/dir1/test.F90,而/dir2/test.F90不能編譯? /dir1/test.F90和/dir2/test.F90都包含在include目錄中。 – apple

+3

如果'Srcfiles'只包含'test.F90',那麼這個makefile就不能工作。所以,顯然這個makefile還有更多的東西沒有共享。因此,我們無法幫助你。 – MadScientist