簡體   English   中英

使一個簡單的makefile通用

[英]Make a simple makefile generic

我有一個簡單的makefile,可以幫助我編譯一些示例:

   ex104: ex104.cpp
        $(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104  

   clean:   
        rm -f *.o $(EXECUTABLE)

現在,這很好。 問題是:我將需要為每個示例顯式編寫一條規則,從而多次復制以下行:

   ex104: ex104.cpp
        $(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104

有沒有一種通用的方法? 這樣,我最終得到的命令行如下所示,它將從自動構建的ex252構建出ex252.cpp

make ex252

幸運的是,這是一個僅模板的庫,因此我始終只需要從一個cpp文件進行構建,並且不需要跟蹤目標文件。

Make有很多默認規則,如果您使用默認規則代替標記,那么您想要的應該起作用。

如果您的make版本沒有這樣的默認值,則應添加一個(與GNU make default規則相對應,其中插入了一些中間變量,並刪除了一個過時的變量):

.cpp:
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@

CXX是C ++編譯器

CXXFLAGS是C ++編譯器的標志

CPPFLAGS是預處理器的標志(它們在gnu make中的C和C ++之間是常見的)

LDFLAGS是鏈接的標志

TARGET_ARCH允許指定目標架構

LDLIBS是要鏈接的庫

也許像這樣:

%: %.cpp
    $(CXX) $< $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o $@

有關$<$@更多詳細信息,請查看自動變量

如果我正確理解了您的問題,那么您正在尋找諸如模式規則之類的東西。 如果是正確的話,此makefile應該編譯目錄中的每個cpp文件(從此處獲取 ):

%.o : %.cpp
        $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@

就像@AProgrammer所說的那樣,請使用內置規則。 我只想對此進行擴展。

您可以通過遞歸grep make的數據庫轉儲找到內置的規則和標志。 make -pq | grep %: make -pq | grep %:獲取可以生成可執行文件並生成make -pq | grep '%: %.cpp' -A5的規則列表。 make -pq | grep '%: %.cpp' -A5查看它執行的實際命令。

就您而言,整個makefile看起來可能像這樣:

all: ex104

只要默認目標要求ex104並且ex104.cpp存在,將選擇%: %.cpp內置規則。 您可以以此為基礎。 添加更多依賴項和標志。

CXXFLAGS += -Wall -Wextra -Wpedantic -std=c++14
all: ex104
ex104: common_utils.cpp

PS:在make CPP中指的是C預處理程序,而不是C ++。

暫無
暫無

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

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