[英]Creating a robust Makefile for C++ program
考慮以下瑣碎的Makefile。 請注意,有兩個類,每個類都有對應的.h和.cpp文件。
output: main.o class1.o class2.o
g++ main.o class1.o class2.o -o output
main.o: main.cpp
g++ -c main.cpp
class1.o: class1.cpp class1.h
g++ -c class1.cpp
class2.o: class2.cpp class2.h
g++ -c class2.cpp
clean:
rm *.o output
這個Makefile是否健壯? 如何使其更堅固? 有人可以提供此Makefile的更強大版本嗎? 它將在64位Red Hat Linux或CentOS計算機上運行。
如果有關系,我正在使用:
-gcc --version 4.8.4(來自GNU編譯器集合)
-GDB版本:GNU gdb(Ubuntu 7.7.1 -0ubuntu5〜14.04.2)7.7.1
我會寫類似
CXX = g++
# mandatory build flags
AM_CXXFLAGS = -Wall -W -std=gnu++11
# optional build flags
CXXFLAGS = -O2 -Werror
# mandatory link flags
AM_LDFLAGS = -Wl,-as-neeeded
output: main.o class1.o class2.o
${CXX} ${AM_LDFLAGS} ${LDFLAGS} $(filter %.o,$^) -o $@
%: %.cpp
${CXX} ${AM_CXXFLAGS} ${CXXFLAGS} $< -c -o $@
class1.o: class1.cpp class1.h
class2.o: class2.cpp class2.h
*FLAGS
使用以下自動制作符號: AM_*
表示強制性標志,常規標志包含本地設置(例如調試或優化)。
通常, AM_CPPFLAGS
應使用帶有預處理器標志( -I ...
)的AM_CPPFLAGS
和CPPFLAGS
,但在此將其省略
output
目標可能也需要${LIBS}
,此處已省略
依賴跟蹤更加棘手, 沒有實現; 您將不得不在此處使用-dM
編譯器選項...
當程序僅包含列出的5個文件時,您可以編寫
output_SOURCES = main.c class1.c class2.c class1.h class2.h
output: ${output_SOURCES}
${CXX} ${AM_CXXFLAGS} ${CXXFLAGS} ${AM_LDFLAGS} ${LDFLAGS} $(filter %.cpp,$^) -o $@ ${LIBS}
直。
編輯:
對於自動依賴性跟蹤,您可以編寫
DEPGENFLAGS = \
-MD -MF ${@D}/.${@F}.d -MT '$@'
%: %.cpp
${CXX} ${DEPGENFLAGS} ${AM_CXXFLAGS} ${CXXFLAGS} $< -c -o $@
-include .deps.main.o.d
-include .deps.class1.o.d
-include .deps.class2.o.d
我認為您的原始makefile不會超出預期范圍。 我剛剛添加了一些內容:
all
目標-明確表示好 CXXFLAGS
環境變量 main.o
依賴於class1.h
和class2.h
, class2.h
clean
構建工件,則指定clean
是PHONY
目標,只是PHONY
安全考慮 ALL := output
all : $(ALL)
output: main.o class1.o class2.o
g++ $(CXXFLAGS) main.o class1.o class2.o -o output
main.o: main.cpp class1.h class2.h
g++ $(CXXFLAGS) -c main.cpp
class1.o: class1.cpp class1.h
g++ $(CXXFLAGS) -c class1.cpp
class2.o: class2.cpp class2.h
g++ $(CXXFLAGS) -c class2.cpp
.PHONY : clean
clean:
rm *.o output
如何使其更堅固?
使用隱式規則,保持簡單。
LDLIBS+=-lstdc++
output: main.o class1.o class2.o
clean:
rm *.o output
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.