[英]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.