簡體   English   中英

Makefile用.cpp列表編譯

[英]Makefile compile with list of .cpp

可以用make編譯一個.cpp列表嗎? 在我的 makefile 中,我有 2 個列表,一個是 of.o,第二個是 for.cpp。 the.o 的列表與 of.cpp 相同,但路徑不同。 我不能使用 vpath,因為我有多個同名的 cpp。

我可以瀏覽.o 但不能瀏覽.cpp:

$(OBJS): $(SRC)
     $(LINKER) -g -o $@ $^ $(LDFLAGS)

在這種情況下,my.cpp 與 all.o 相同。

$(OBJS) 是.o 的列表,$(SRC) 是.cpp

Makefile 示例:

COMPILATEUR=g++
LINKER=g++
LDFLAGS=
CFLAGS=-Og
PATH_BUILD=$(pwd)/Build/
EXE=Bidou

INCLUDES= -I"AAA/BBB" \
    -I"AAA/BBB/CC/dd"

SRC= AAA/BBB/CC/dd.cpp \
     AAA/BBB/hh.cpp \
     AAA/BBB/CC/dd/ee.cpp \
     AAA/BBB/cc.cpp

OBJS:= $(addprefix $(PATH_BUILD)/,$(notdir $(SRC:%.cpp=%.o)))

$(OBJS): $(SRC)
    @mkdir -p $(PATH_BUILD)
    @echo "\n##$<"
    $(COMPILATEUR) $(INCLUDES) $(CFLAGS) "$<" -g -c -o $@

$(EXE): $(OBJS)
    $(LINKER) -g -o $@ $^ $(LDFLAGS)

clean:
    rm -fr $(PATH_BUILD)

那條規則……真的是錯誤的。 目標是 object 文件,但您使用的配方是生成可執行文件的鏈接命令,而不是生成 object 文件的編譯命令。

除非我們知道SRCOBJS變量的內容,否則我們真的無能為力。

例如,如果事實上所有 object 文件與源文件的路徑相同,只是擴展名從.cpp更改為.o ,那么您甚至不需要定義規則來構建這些 object 文件:有一個內置的規則; 你可以寫:

program: $(OBJS)
        $(LINKER) -g -o $@ $^ $(LDFLAGS)

(如果您想從 object 文件創建的程序的名稱是program )。

預計到達時間

如果沒有算法方法可以可靠地將 object 文件名轉換為單個已知源文件,那么您就無法編寫可以完成這項工作的模式規則。

這意味着您必須手動寫出所有依賴關系。 你可以這樣做:

$(OBJS) :
        @mkdir -p $(@D)
        @echo "\n##$<"
        $(COMPILATEUR) $(INCLUDES) $(CFLAGS) "$<" -g -c -o $@

$(for S,$(SRCS),$(eval $(PATH_BUILD)/$(notdir $(S:%.cpp=%.o)): $S))

這創建了一種構建每個 object 文件的方法,然后根據其相關的.c文件為每個.o文件編寫一組單獨的依賴項。

暫無
暫無

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

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