簡體   English   中英

為C ++程序創建健壯的Makefile

[英]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_CPPFLAGSCPPFLAGS ,但在此將其省略

  • 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不會超出預期范圍。 我剛剛添加了一些內容:

  1. 添加了默認的all目標-明確表示好
  2. 在對g ++的所有調用中使用CXXFLAGS環境變量
  3. 使main.o依賴於class1.hclass2.hclass2.h
  4. 如果添加名為clean構建工件,則指定cleanPHONY目標,只是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.

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