15

我有一个生成文件模板来编译单个 DLL(用于插件系统)。用户的 makefile 如下所示:

EXTRA_SRCS=file1 file2
include makefile.in

makefile.in我有:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))

plugin.os要编译的主要 C++ 文件在哪里。顺便说一句,文件结尾是.os为共享库编译的目标文件(即使用-fpic选项 with gcc

现在,问题是额外的源可能(但不一定)是头文件。理想情况下,我想将它们添加为目标plugin.os和 的依赖项file.cpp,但前提是它们存在。

该方法应该适用于 windows 和 linux,或者至少适用于每个。但是,我只使用 GNU 版本的 make。

4

3 回答 3

19

使用“通配符”功能:

$(wildcard *.h)

编辑:为了匹配特定列表,请执行

$(wildcard $(HEADER_FILES))

无需使用$(filter ...),通配符功能会自动过滤不存在​​的文件。

于 2008-10-30T13:25:56.407 回答
5

您没有指定正在使用的编译器,但如果您可以访问 gcc/g++,则可以使用 -MM 选项。

我所做的是为每个 .c 或 .cpp 文件创建一个扩展名为 .d 的文件,然后“包含” .d 文件。我在我的 Makefile 中使用了这样的东西:

%.d: %.c
        gcc $(INCS) $(CFLAGS) -MM $< -MF $@

%.d: %.cpp
        g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@

然后我创建这样的依赖项:

C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)

这在 Makefile 的底部:

include $(DEPS)

这是你想要的那种行为吗?这种方法的美妙之处在于,即使您使用非 GNU 编译器进行实际编译,GNU 编译器也能很好地计算依赖关系。

于 2008-10-30T16:20:19.080 回答
3

做简单的

$(filter $(wildcard *.h),$(HEADER_FILES))

做你想做的事?

于 2008-10-30T16:30:21.790 回答