You need to enable JavaScript to run this app. 从其他Makefile编译Postgres源码提示'utils/errcodes.h'不存在如何解决
优惠活动
大模型
产品
解决方案
定价
更多

从其他Makefile编译Postgres源码提示'utils/errcodes.h'不存在如何解决

问题修复方案

问题根源

  1. pwd变量被提前展开:Make会在执行shell命令前对命令内容做预解析,你写的 `pwd` 会在执行cd postgres-REL_13_3之前就被求值,取到的是上层Makefile所在目录的路径,导致configure的prefix参数错误,编译时头文件查找路径异常。
  2. 构建环境变量干扰:Make默认会将MAKEFLAGS、MAKELEVEL等变量传递给子make进程,Postgres 13.3的构建系统对这类外来变量敏感度较高,若上层Make开启了并行编译(-j参数),还会导致自动生成的头文件errcodes.h尚未完成生成,就启动了依赖它的源码编译任务,最终触发头文件找不到的报错。

修正后的Makefile规则

build:
	curl -LJ https://github.com/postgres/postgres/archive/refs/tags/REL_13_3.zip -o postgres.zip
	unzip postgres.zip
	rm postgres.zip

	cd postgres-REL_13_3 \
		&& ./configure --prefix "$$(pwd)" --without-readline --without-zlib \
		&& MAKEFLAGS= $(MAKE) -j1 \
		&& MAKEFLAGS= $(MAKE) install

改动说明

  • 用$$(pwd)替代原有的`pwd`:Make中双$会被转义为单个$传递给shell,确保pwd命令在进入postgres源码目录后才由shell执行,得到正确的路径值。
  • 调用子make前临时清空MAKEFLAGS变量:避免上层Make的参数传入Postgres的构建流程,干扰原生构建逻辑。
  • 增加-j1参数强制单线程编译:解决Postgres 13.3版本并行构建时偶发的依赖顺序错误问题,确保自动生成的头文件完成生成后再执行后续编译任务。
  • 注意:所有规则下的命令行必须使用Tab字符缩进,不能用空格,否则Make会识别报错。

内容的提问来源于stack exchange,提问作者Mercury

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 07:45:03