gpt4 book ai didi

makefile - GNU Make 3.80 eval 错误的解决方法

转载 作者:行者123 更新时间:2023-12-02 22:05:00 30 4
gpt4 key购买 nike

我正在尝试为我的 Makefile 创建一个通用构建模板,有点像他们在 eval documentation 中讨论的那样。 .

我在 GNU Make 3.80 中遇到了一个已知错误。当 $(eval) 计算超过 193 个字符的行时,Make 会崩溃并出现“虚拟内存耗尽”错误。

导致问题的代码如下所示。

SRC_DIR = ./src/

PROG_NAME = test

define PROGRAM_template
$(1)_SRC_DIR = $$(SRC_DIR)$(1)/
$(1)_SRC_FILES = $$(wildcard $$($(1)_SRC_DIR)*.c)
$(1)_OBJ_FILES = $$($(1)_SRC_FILES):.c=.o)

$$($(1)_OBJ_FILES) : $$($(1)_SRC_FILES) # This is the problem line
endef

$(eval $(call PROGRAM_template,$(PROG_NAME)))

当我运行这个 Makefile 时,我得到

gmake: *** virtual memory exhausted.  Stop.

预期的输出是 ./src/test/中的所有 .c 文件都被编译为 .o 文件(通过隐式规则)。

问题是 $$($(1)_SRC_FILES) 和 $$($(1)_OBJ_FILES) 总共超过 193 个字符长(如果有足够的源文件)。

我尝试在只有 2 个 .c 文件的目录上运行 make 文件,并且工作正常。只有当 SRC 目录中有很多 .c 文件时,我才会收到错误。

我知道 GNU Make 3.81 修复了这个错误。不幸的是,我没有权限或能力在我正在使用的系统上安装较新的版本。我坚持使用 3.80。

那么,有什么解决办法吗?也许拆分 $$($(1)_SRC_FILES) 并在 eval 中单独声明每个依赖项?

最佳答案

哈哈黑客

ifneq (3.81,$(shell (echo $(MAKE_VERSION); echo 3.81) | sort | head -n1))

make-3.81/make:
wget -nc http://ftp.gnu.org/pub/gnu/make/make-3.81.tar.gz
gzip -cd make-3.81.tar.gz | tar xvf -
cd make-3.81 && ./configure --prefix=$$(pwd)
$(MAKE) -C make-3.81 make

%: make-3.81/make
make-3.81/make $@

else

# rest of your makefile

endif

说真的,不可能有任何事情阻止您安装 3.81,即使它只是在本地。

关于makefile - GNU Make 3.80 eval 错误的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2428506/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com