簡體   English   中英

GNU Makefile-多個目標的通用Makefile

[英]GNU Makefile - Generic Makefile for several targets

我目前正在開發一個帶有小代碼示例的C ++軟件包,用於教學目的。 我設法編寫了一個如下所示的Makefile,它將所有* .cpp文件編譯為* .o文件,並將它們鏈接到可執行文件:

CC=gcc
CFLAGS=-g
LDFLAGS= -lstdc++
ECHO = echo
SILENT = @

MODULES = example1 example2 example3

all: $(MODULES)

#a generic rule to create .o files from .cpp files (e.g. example1.cpp -> example1.o)
%.o: %.cpp
    $(SILENT) $(ECHO) "--- Compiling $< ---"
    $(SILENT) $(CC) -c $(CFLAGS) $<

#define targets and their dependencies
example1: example1.o
    $(SILENT) $(ECHO) "--- Linking $@ ---"
    $(SILENT) $(CC) $^ -o $@ $(LDFLAGS)

example2: example2.o
    $(SILENT) $(ECHO) "--- Linking $@ ---"
    $(SILENT) $(CC) $^ -o $@ $(LDFLAGS)

example3: example3.o
    $(SILENT) $(ECHO) "--- Linking $@ ---"
    $(SILENT) $(CC) $^ -o $@ $(LDFLAGS)

clean:
    $(SILENT) $(ECHO) "--- Removing object files and binaries ---"
    $(SILENT) rm -f *.o 
    $(SILENT) rm -f $(MODULES)

.PHONY: clean

到目前為止,一切正常。 它將使用example1.cpp,example2.cpp和example3.cpp,並將其編譯/鏈接到3個可執行文件“ example1 example2 example3”。

但是,由於每個可執行文件都具有與對象相同的名稱(例如,“ example1.o”將鏈接到可執行文件“ example1”),所以我想知道是否還有一種使用通用規則的方法。

我嘗試了幾種方法:

%: %.o
    $(SILENT) $(ECHO) "--- Linking $@ ---"
    $(SILENT) $(CC) $^ -o $@ $(LDFLAGS)

據我了解,該規則應采用所有目標文件並創建一個與目標文件同名的可執行文件,但我無法使其正常運行! 有沒有人暗示如何實現這一目標?

問題在於,存在一個直接從源文件構建程序的內置規則。 Make將選擇該選項,而不是鏈接兩個規則。

您可以通過用空規則覆蓋該規則取消該規則:

%: %.cpp

或者,您可以完全刪除規則,然后讓該規則做正確的事情。 隱式規則有一條沿

$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $@

因此您可以使用這些變量來選擇編譯器為預處理器,編譯器和鏈接器指定的標志。 例如,您可以更改CXX以將編譯器用於錯誤的語言,並根據需要通過添加LDFLAGS=-lstdc++消除損害,就像您的makefile一樣。

解決方法如下:

在上面的示例中,我沒有使用$(LDLIBS)變量,該變量由內置默認規則使用。 如果我將Makefile更改為使用$(LDLIBS)而不是$(LDFLAGS),一切都很好!

解決方案1 ​​:(內置規則)

CC=gcc
CFLAGS=-g -fopenmp
LDFLAGS= 
LDLIBS = -lstdc++ -lgomp
ECHO = echo
SILENT = @

MODULES = example1 example2 example3

all: $(MODULES)

clean:
    $(SILENT) $(ECHO) "--- Removing object files and binaries ---"
    $(SILENT) rm -f *.o 
    $(SILENT) rm -f $(MODULES)

.PHONY: clean

解決方案2 :(用戶定義的規則)

CC=gcc
CFLAGS=-g -fopenmp
LDFLAGS= 
LDLIBS = -lstdc++ -lgomp
ECHO = echo
SILENT = @

MODULES = example1 example2 example3

all: $(MODULES)

#disable built-in rule
%: %.cpp

#rule for *.cpp -> *.o
%.o: %.cpp
    $(SILENT) $(ECHO) "--- Compiling $< ---"
    $(SILENT) $(CC) -c $(CFLAGS) $(LDFLAGS) $<

#rule for object -> exectutable
%: %.o
    $(SILENT) $(ECHO) "--- Linking $@ ---"
    $(SILENT) $(CC) $^ $(LDLIBS) -o $@ 

clean:
    $(SILENT) $(ECHO) "--- Removing object files and binaries ---"
    $(SILENT) rm -f *.o 
    $(SILENT) rm -f $(MODULES)

.PHONY: clean

暫無
暫無

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

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