[英]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.