【发布时间】:2012-05-05 14:50:08
【问题描述】:
我一直在研究一个链接到 .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 将被重新制作,那么 PROG 将是 remake(relink),这不是我想要的。我只是改变了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 文件。
【问题讨论】:
-
如果您只想构建库,您可以使用
make liba.so -
嗨,DryYap。我想构建PROG并检测是否需要重新构建liba.so。
-
你说有一个依赖文件,所以
prog.cpp依赖于a.h。因此,如果接口发生变化,PROG 将被重建。但是为什么PROG依赖于liba.so呢?我希望all依赖于liba.so。 -
嗨,莫里斯。正如你所说,
all可以同时依赖于PROG和liba.so。但是您必须指定它们之间的构建顺序,以便在构建PROG之前构建liba.so。这是我的问题。 -
对于
make -j1,这是默认选项,这将起作用。但是如果你通过make -j2运行它,就会出现问题。如果liba.so的构建时间长于PROG的,则不保证PROG使用新的liba.so。问题是PROG没有明确依赖于liba.so。