所以GNU Make的$(通配符)函数似乎存在这个问题,在Windows上保持一个目录打开。请参阅(未答复)帖子“ make正在打开目录&QUOT ;. Google没有提供有关该主题的更多信息。

简而言之:Makefile在某些时候使用$(通配符)函数,并保持一个目录打开,这通常会阻止“make clean”。规则正确地开展工作。重新运行“make clean”第二次通常会解决它。

我在标准的DOS-Box下使用GNU Make 3.81版。上面链接的帖子的作者使用的是Cygwin。

有人找到了解决此问题的方法吗?

有帮助吗?

解决方案 2

我找到了问题的解决方法,这至少让我安心工作。

问题是 $(通配符)函数用于收集源文件。但是,我的清洁规则只删除一个目录 - 不需要收集费用。所以我基本上把需要收集源文件的Makefile部分放在条件语句中:

# The clean rule is always parsed
clean:
    rm -rf $(OUTPUT_DIRECTORY)

# The compile rule is only interpreted if we did not invoke 'make clean'. We
# can test the value of $(MAKECMDGOALS) for that:
ifeq ($(filter $(MAKECMDGOALS),clean),)

SOURCE_FILES := $(wildcard ...)

compile:
    g++ $(SOURCE_FILES) ...

endif

其他提示

听起来像是文件描述符泄露,没问题 - 对于UNIX上非常短暂的进程(如make)无害,但在Windows上是正确的PITA。

因为据说这是make中的一个错误,而不是它的使用问题,所以应首先通过验证它在最新上游版本的源代码构建时仍然存在,然后通过向GNU make项目提交错误报告(或与您有适当支持合同的任何经销商) ),或潜入源头并试图自己修复它。

尝试在Linux上重现并不会有害 - 在这里检查文件描述符泄漏要容易得多,因为可以只看一下 / proc / self / fd (或者,对于对于不属于的东西,make的子, / proc / $ PPID / fd )。

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