2011-04-25 50 views
0

我對makefile非常新穎。我之前完成的最複雜的任務是在已經設計的makefile中包含新的.h和和.cpp或.c文件。如何動態重命名生成文件中的目標文件

我必須將項目的編譯過程從Visual Studio移植到gcc,並且有一個已經爲同事編寫的解決方案,但他使用了4個bash腳本和一個makefile來編譯解決方案。

而不是這樣做,我正在尋找解決方案,以便於維護。我承認我的問題可能非常愚蠢,但我無法在任何地方找到它,也無法正確理解它。

在下面的目標:

$(OBJECTS): %.o: %.cpp 
    $(CC) $(CPPFLAGS) -c $< -o [email protected] 

我想測試是否正在創建的.o已經存在,並且其重命名爲別的東西。這是必要的,因爲在項目中有幾個具有相同名稱的源文件,但內容不同。

例如,如果正在編譯的當前.cpp被稱爲file.cpp,並且將生成的對象是file.o,那麼該規則應該測試file.o是否已經存在,並將當前file.o重命名爲某個其他。

如果你知道任何解釋這一點的好教程,請讓我知道。我發現了很多示例,展示瞭如何對由該規則編譯的當前文件進行測試,但沒有一個會重命名對象.o。

在此先感謝,並對此處寫下的任何「啞巴」感到抱歉。 :-)

+0

我過去所做的是將對象文件放置在與源文件相同的目錄層次結構中。我想你有不同級別的文件名稱相同? – Max 2011-04-25 19:10:55

+0

@Max,是的。有兩個不同的目錄,其中源文件命名爲file1.cpp file2.cpp等。 – zlogdan 2011-04-27 12:31:41

回答

1

首先,您要對我們深表同情。

Make的設計並非真正處理這種歧義,所以我們必須使用一個kludge。你還沒有說你想重命名文件,所以現在讓我們說我們將file.o移動到file_save.o

# This tells Make that these are not real targets, so that it will 
# proceed even if file.o already exists. 
.PHONY: $(OBJECTS) 

$(OBJECTS): %.o: %.cpp 
    # If file.o exists, move it to file_save.o 
    @if [ -f [email protected] ]; then mv [email protected] $*_save.o; fi 
    $(CC) $(CPPFLAGS) -c $< -o [email protected] 
+0

嘿,非常感謝。此代碼似乎工作,但* _save.o文件未生成。我認爲這是因爲我的源cpp文件是在一個變量'SOURCE = file1.cpp file2.cpp file1.cpp'中定義的,然後我使用'OBJECTS = $(SOURCES:.cpp = .o)'來創建OBJECTS規則。 – zlogdan 2011-04-25 16:50:03

+0

真的嗎?這應該沒關係......用這個替換'if'行,看看會發生什麼:'mv $ @ $ * _ save.o'。它第一次會抱怨,當沒有'file.o'移動時,它會做同樣的事情並告訴你它在做什麼。 – Beta 2011-04-25 17:48:05

+0

感謝您的幫助!當我嘗試它時,會在第一個.o未找到後立即中止編譯。 – zlogdan 2011-04-25 19:09:33

1

我對這個問題意見的擴展:

也許你應該考慮把目標文件在同一目錄hieryarchy作爲源文件,以防止命名衝突。

因此,src/network/client.cpp被編譯爲build/obj/network/client.o。

我非常生疏,當涉及到的makefile,但我相信我解決了,通過做這樣的事情:

$SRC= src/network/client.cpp src/main.cpp ..... 
$OBJ= makefile_replace_function($SRC, .o) 

$(OBJ) : $(SRC) 
    compile_instructions 

在那裏你將不得不更換makefile_replace_functioncompile_instructions其真實的等價物,因爲我已經忘記了,然後...

我意識到這可能不是很有幫助,但至少有一個想法考慮。