0

我有一些相互使用的库。每当我构建它们中的任何一个时,我都需要定义预处理器定义以确保使用正确的可见性修饰符(例如 Windows 中的 dllimport/dllexport)。

所有库都使用相同的makefile,即它们共享规则、CFLAGS 等。所有这些库仅在输入文件列表上有所不同,其余的makefile 由库共享。

共享的 makefile 有一个包含所有库列表的变量,如下所示:

MODULE_LIBS = liba123 libb456 libc999

然后,我需要为每个库启用这些预处理器定义:

For liba123: -Da123_EXPORTS
For libb456: -Db456_EXPORTS
For libc999: -Dc999_EXPORTS

这些库中的每一个都存在于它们各自的子文件夹中,这些子文件夹的名称类似于库本身(例如 liba123、libb456 等)。因此,我编写了这个 makefile 技巧,以根据正在编译的文件的路径启用这些 EXPORTS 定义:

%.o: %.c
     $(CC) $(CPPFLAGS) $(CFLAGS) -D$(filter $(MODULE_LIBS),$(subst lib, ,$(subst /, ,$@)))_EXPORTS -c - o $@ $<


我必须到处添加那个东西 ('-D$(filter $(MODULE_LIBS),$(subst lib, ,$(subst /, ,$@)))_EXPORTS'),因为我有很多类似的规则。所有这些不同的规则都无能为力,但它们有一个共同点:$(CPPFLAGS)。
问题来了。我可以将“-D$(filter $(MODULE_LIBS),$(subst lib, ,$(subst /, ,$@)))_EXPORTS”添加到 CPPFLAGS 中吗它在哪里使用?

4

1 回答 1

0

我想我会这样做:

liba123/%.o : EXPORTS=a123_EXPORTS
libb456/%.o : EXPORTS=b456_EXPORTS
libc999/%.o : EXPORTS=c999_EXPORTS

%.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -D$(EXPORTS) -c -o $@ $<

但是,如果您愿意,可以将它们放在 CPPFLAGS 中:

liba123/%.o : CPPFLAGS+=-Da123_EXPORTS
libb456/%.o : CPPFLAGS+=-Db456_EXPORTS
libc999/%.o : CPPFLAGS+=-Dc999_EXPORTS
于 2012-07-27T18:09:06.243 回答