[c++] 如何製作一個SIMPLE C ++ Makefile?



Answers

我一直認為用一個詳細的例子可以更容易地學習,所以這裡是我對makefile的看法。 對於每個部分,您都有一行沒有縮進的行,它顯示了依賴關係後面的部分的名稱。 依賴關係可以是其他部分(將在當前部分之前運行)或文件(如果更新會導致當前部分在您下次運行make時再次運行)。

這裡有一個簡單的例子(請記住,我使用了4個空格,我應該使用一個標籤,Stack Overflow不會讓我使用標籤):

a3driver: a3driver.o
    g++ -o a3driver a3driver.o

a3driver.o: a3driver.cpp
    g++ -c a3driver.cpp

當你輸入make ,它會選擇第一部分(a3driver)。 a3driver取決於a3driver.o,因此它將轉到該部分。 a3driver.o取決於a3driver.cpp,因此它只會在a3driver.cpp自上次運行後發生更改時才運行。 假設它已經(或從未運行),它將編譯a3driver.cpp到一個.o文件,然後返回到a3driver並編譯最終的可執行文件。

由於只有一個文件,它甚至可以被簡化為:

a3driver: a3driver.cpp
    g++ -o a3driver a3driver.cpp

我展示第一個例子的原因是它顯示了makefile的強大功能。 如果你需要編譯另一個文件,你可以添加另一個部分。 下面是一個secondFile.cpp(它加載一個名為secondFile.h的頭文件)的例子:

a3driver: a3driver.o secondFile.o
    g++ -o a3driver a3driver.o secondFile.o

a3driver.o: a3driver.cpp
    g++ -c a3driver.cpp

secondFile.o: secondFile.cpp secondFile.h
    g++ -c secondFile.cpp

這樣,如果你改變了secondFile.cpp或secondFile.h中的內容並重新編譯,它只會重新編譯secondFile.cpp(而不是a3driver.cpp)。 或者,如果您在a3driver.cpp中更改某些內容,則不會重新編譯secondFile.cpp。

如果您對此有任何疑問,請告知我們。

包含名為“all”的部分和名為“clean”的部分也是傳統的。 “all”通常會構建所有的可執行文件,“clean”將刪除“構建文件”,如.o文件和可執行文件:

all: a3driver ;

clean:
    # -f so this will succeed even if the files don't exist
    rm -f a3driver a3driver.o

編輯:我沒有註意到你在Windows上。 我認為唯一的區別是將-o a3driver更改為-o a3driver.exe

Question

我們被要求使用一個Makefile來為我們的項目整合所有東西,但是我們的教授從來沒有告訴我們如何去做。

我只有一個文件, a3driver.cpp 。 驅動程序從位置"/user/cse232/Examples/example32.sequence.cpp"導入一個類。

就是這樣,其他所有內容都包含在.cpp

我將如何去做一個簡單的Makefile來創建一個名為a3a.exe的可執行文件?




我用了弗德莫的答案。 我仔細研究了一下,這似乎是一個很好的開始。 該解決方案還具有定義好的添加編譯器標誌的方法。 我再次回答,因為我進行了更改,使其在我的環境Ubuntu和g ++中工作。 有時,更多的實例是最好的老師。

appname := myapp

CXX := g++
CXXFLAGS := -Wall -g

srcfiles := $(shell find . -maxdepth 1 -name "*.cpp")
objects  := $(patsubst %.cpp, %.o, $(srcfiles))

all: $(appname)

$(appname): $(objects)
    $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(appname) $(objects) $(LDLIBS)

depend: .depend

.depend: $(srcfiles)
    rm -f ./.depend
    $(CXX) $(CXXFLAGS) -MM $^>>./.depend;

clean:
    rm -f $(objects)

dist-clean: clean
   rm -f *~ .depend

include .depend

makefiles似乎非常複雜。 我正在使用一個,但它產生了一個錯誤,與g ++庫中沒有鏈接有關。 這個配置解決了這個問題。




老問題,我知道,但為了後代。 你有兩個選擇。

選項1:最簡單的makefile = NO MAKEFILE。

將“a3driver.cpp”重命名為“a3a.cpp”,然後在命令行上寫入:

nmake a3a.exe

就是這樣。 如果你使用gnu-make使用“make”或“gmake”或其他。

選項2:一個2行makefile。

a3a.exe: a3driver.obj
        link /out:a3a.exe a3driver.obj

瞧。




Links



Tags

c++ c++   makefile