如何检查生成文件中是否存在文件



我有一个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,或者至少适用于每种情况。然而,我只使用make的GNU版本。

使用"通配符"函数:

$(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编译器也能很好地计算依赖关系。

做简单的

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

做你想做的事?

相关内容

  • 没有找到相关文章

最新更新