我一直在开发一个链接到 .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.h.
但是这样一来,一旦我改变了a.cpp,liba.so就会被remake,那么PROG就会是
重制(重新链接),这不是我想要的。我只是改变了liba.so的实现,
但没有任何接口定义。 PROG应该在我改变之后重新制作a.h.
我想让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 文件。