我有一些相互使用的库。每当我构建它们中的任何一个时,我都需要定义预处理器定义以确保使用正确的可见性修饰符(例如 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 中吗它在哪里使用?