【问题标题】:How to specify Makefile target building order without put any physical dependencies?如何在不放置任何物理依赖项的情况下指定 Makefile 目标构建顺序?
【发布时间】: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 可以同时依赖于PROGliba.so。但是您必须指定它们之间的构建顺序,以便在构建PROG 之前构建liba.so。这是我的问题。
  • 对于make -j1,这是默认选项,这将起作用。但是如果你通过make -j2 运行它,就会出现问题。如果liba.so的构建时间长于PROG的,则不保证PROG使用新的liba.so。问题是PROG 没有明确依赖于liba.so

标签: c++ makefile


【解决方案1】:

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

【讨论】:

  • 谢谢,朋友。这就是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 2015-02-07
  • 1970-01-01
  • 2014-03-19
  • 2018-06-14
  • 1970-01-01
相关资源
最近更新 更多