簡體   English   中英

如何在不放置任何物理依賴性的情況下指定Makefile目標構建順序?

[英]How to specify Makefile target building order without put any physical dependencies?

我一直在研究一個鏈接到.so(動態庫)文件的C ++項目。 假設我有一個需要鏈接到a.so的目標PROG,而且我也構建了a.so,在下面的Makefile中指定。

PROG_SRCS = prog.cpp
PROG_OBJS = $(PROG_SRCS: %.cpp:%.o)

all: PROG
PROG: $(PROG_OBJS) liba.so
    $(LINK.cpp) -o $@ $(PROG_OBJS) -la

LIBA_SRCS = liba/a.cpp
LIBA_OBJS = $(LIBA_SRCS: %.cpp:%.o)

liba.so: $(LIBA_OBJS)
    $(LINK.cpp) -shared -Wl.-soname,$@ -o $@ $^

我使用自動依賴生成來使.cpp文件獲得它們對.h文件的依賴。 而prog.cpp包括啊

但通過這種方式,一旦我改變a.cpp,liba.so將被重制,那么PROG將被重制(重新鏈接),這不是我想要的。 我只是改變了liba.so的實現,但沒有改變任何接口定義。 PROG應該在我改變后重新制作啊

我想在構建PROG之前建立a.so,但a.so的更改不會導致PROG的構建。

下面的Makefile是我想出的方法,但有一點副作用(生成一個臨時文件)。

ORDER = /tmp/.ORDER

all: PROG
PROG: $(PROG_OBJS) $(ORDER)
    $(LINK.cpp) -shared -Wl,-soname,$@ -o $@ $(PROG_OBJS) -la

$(ORDER): liba.so
    test -e $@ || touch $@

這樣,每次liba.so重制時,$(ORDER)也會被重制。 但它只觸摸文件,如果它不存在。

有沒有辦法指定這種依賴,沒有任何副作用,例如創建一個tmp文件。

如果您願意依賴GNU make的非可移植方面,那么您可以使用僅限訂單的先決條件 除了你已經發現的戳文件方法之外,這是唯一的方法。

暫無
暫無

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

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