Mac M1升级Go版本构建Postgres FDW项目遇arm64链接错误
- 环境:Mac M1(arm64)、Go 1.21、PostgreSQL 14
- 操作:通过
go mod edit --go 1.21将steampipe-postgres-fdw项目的go.mod版本改为1.21后,执行make构建 - 错误信息:
Undefined symbols for architecture arm64:
"_res_9_nclose", referenced from:
_internal/syscall/unix.libresolv_res_9_nclose_trampoline.abi0 in steampipe_postgres_fdw.a(go.o)
"_res_9_ninit", referenced from:
_internal/syscall/unix.libresolv_res_9_ninit_trampoline.abi0 in steampipe_postgres_fdw.a(go.o)
"_res_9_nsearch", referenced from:
_internal/syscall/unix.libresolv_res_9_nsearch_trampoline.abi0 in steampipe_postgres_fdw.a(go.o)
ld: symbol(s) not found for architecture arm64
解决方法
1. 强制链接libresolv库
修改项目Makefile中的Go构建命令,添加-ldflags="-lresolv"参数,强制链接libresolv库(缺失的符号属于该库)。比如找到Makefile里类似go build的行,修改为:
go build -ldflags="-lresolv" [原有构建参数]
2. 验证PostgreSQL架构适配
确保安装的PostgreSQL 14是arm64版本,而非x86_64通过Rosetta运行的版本。执行以下命令检查:
pg_config --libdir
如果输出路径包含arm64则没问题;若为x86_64,重新安装arm64版PostgreSQL(比如Homebrew下执行brew install postgresql@14)。
3. 清理构建缓存后重试
清理Go构建缓存和项目中间文件,再重新构建:
go clean -cache make clean make
4. 临时回退Go版本(备选)
如果以上方法都无效,可切换回Go 1.19版本构建,用版本管理工具(比如goenv)快速切换:
goenv local 1.19 make
内容的提问来源于stack exchange,提问作者Binaek Sarkar

