我一直在研究一个链接到 .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 文件。