我有一个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.os
和它们的依赖项file.cpp
,但前提是它们存在.
该方法应适用于Windows和Linux,或至少适用于每个.但是,我只使用了GNU版本的make.
使用"通配符"功能:
$(wildcard *.h)
编辑:为了匹配特定的列表,做
$(wildcard $(HEADER_FILES))
没有必要使用$(filter ...),通配符函数自动过滤不存在的文件.
您没有指定要使用的编译器,但是如果可以访问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编译器也可以很好地计算依赖关系。