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

EXTRA_SRCS=file1 file2
include makefile.in

在里面 makefile.in 我有:

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

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

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

该方法应该适用于 Windows 和 Linux,或者至少适用于两者。不过,我只使用 GNU 版本的 make。

有帮助吗?

解决方案

使用“通配符”功能:

$(wildcard *.h)

编辑:为了匹配特定列表,请执行以下操作

$(wildcard $(HEADER_FILES))

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

其他提示

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

我所做的是为每个.c或.cpp文件创建一个扩展名为.d的文件,然后<!> quot; include <!> quot; .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编译器也能很好地计算依赖关系。

是否简单

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

做你想做的事吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top