我一直致力于一个链接到.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.h。
但是通过这种方式,一旦我改变a.cpp,liba.so将被重制,那么PROG将是 翻拍(重新链接),这不是我想要的。我只是改变了liba.so的实现, 但没有任何接口定义。 PROG应该在我更改a.h后重新制作。
我想在构建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文件。
答案 0 :(得分:3)
如果您愿意依赖GNU make的非可移植方面,则可以使用仅限订单的先决条件order-only prerequisites。除了你已经发现的戳文件方法之外,这是唯一的方法。