如何在不放置任何物理依赖性的情况下指定Makefile目标构建顺序?

时间:2012-05-05 05:01:05

标签: c++ makefile

我一直致力于一个链接到.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文件。

1 个答案:

答案 0 :(得分:3)

如果您愿意依赖GNU make的非可移植方面,则可以使用仅限订单的先决条件order-only prerequisites。除了你已经发现的戳文件方法之外,这是唯一的方法。