簡體   English   中英

C ++ - 使用g ++創建Makefile

[英]C++ - Makefile using g++

我為我的CMSC 202課程項目'Blackjack'制作了一個Makefile。 它做我需要的一切,它完美地運作。 你可能會問我為什么發布在這里,這是因為我不知道它是如何工作的,我沒有使用任何其他資源,而是我自己創建它。

這是我的Makefile代碼。

# Object files to either reference or create                          
OBJECTS = Proj2.o Blackjack.o Deck.o Card.o Hand.o Player.o           
# The executable file that will be created at the end                 
EXEC = Proj2.out                                                      
# The flags to use for compilation                                    
FLAGS = -Wall                                                         
# The code compiler to use for compilation                            
CC = g++                                                              

# Perform action on all object files (May or may not exist)           
all: $(OBJECTS)                                                       
        $(CC) $(FLAGS) -o $(EXEC) $(OBJECTS)

這是我在終端中調用make時的終端輸出。

g++    -c -o Proj2.o Proj2.cpp
g++    -c -o Blackjack.o Blackjack.cpp
g++    -c -o Deck.o Deck.cpp
g++    -c -o Card.o Card.cpp
g++    -c -o Hand.o Hand.cpp
g++    -c -o Player.o Player.cpp
g++ -Wall -o Proj2.out Proj2.o Blackjack.o Deck.o Card.o Hand.o Player.o

誰能告訴我.o文件是如何編譯的? 它看起來不像是在Makefile中的任何地方提示使用g++ -c -o $.o $.cpp命令編譯它們。 我也沒有聲明使用任何.cpp文件。

預先感謝您的幫助。

編輯

感謝您的大力幫助,這是我使用make時收到的終端輸出。

g++ -Wall   -c -o Proj2.o Proj2.cpp
g++ -Wall   -c -o Blackjack.o Blackjack.cpp
g++ -Wall   -c -o Deck.o Deck.cpp
g++ -Wall   -c -o Card.o Card.cpp
g++ -Wall   -c -o Hand.o Hand.cpp
g++ -Wall   -c -o Player.o Player.cpp
g++ -Wall -o Proj2.out Proj2.o Blackjack.o Deck.o Card.o Hand.o Player.o

非常感謝所有貢獻的人。

Make有一組隱式規則(參見此處參考)。 例如

Compiling C++ programs
`n.o' is made automatically from `n.cc' or `n.C' with a command of the form 
`$(CXX) -c $(CPPFLAGS)   $(CXXFLAGS)'. 

大多數make還會將此規則用於.cpp文件。 當make看到你的某個目標有xo需求時,它將嘗試查看它是否可以使用隱式規則生成xo,並且在你的情況下發現它可以從.cpp文件開始。

此Makefile使用隱式規則 ,這是減少重復的好方法。

默認情況下,將構建第一個目標,此處all 它取決於變量$OBJECTS列出的許多目標文件,例如Proj2.o ,其依賴項未在Makefile中列出。 現在,如果make看到當前目錄中的輸入文件具有匹配的名稱,例如Proj2.cpp ,它將嘗試從中構建Proj2.o (其他語言中的源還有其他隱式規則)。 然后默認使用命令構建Proj2.o .

$(CXX) $(CXXFLAGS) -c -o Proj2.o

其中$(CXX)是C ++編譯器的名稱(在您的情況下為g++ )。

所有顯式構建步驟將all目標文件組裝到目標可執行文件中。

查看上面的構建命令,您會發現Makefile中存在一個小問題。 由於C ++編譯器的標志是在變量FLAGS中給出的,而不是標准的CXXFLAGS因此在構建目標文件時不會發出警告。 使用標准名稱可以解決這個問題(你確實需要警告,甚至可能超過-Wall給你的警告)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM