4

我一直在研究一个链接到 .so(动态库)文件的 C++ 项目。假设我有一个目标 PROG 需要链接到 a.so,并且 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 将被remake,那么PROG 将被remake(relink),这不是我想要的。我只是更改了 liba.so 的实现,但没有更改任何接口定义。我改了PROG应该重拍啊

我想让 a.so 应该在 PROG 构建之前构建,但是 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 文件。

4

1 回答 1

3

如果您愿意依赖 GNU make 的不可移植方面,您可以为此使用 order-only 先决条件order-only 先决条件。除了您已经发现的邮票文件方法之外,这是唯一的方法。

于 2012-05-05T06:50:08.220 回答