Apple Silicon + macOS Sequoia环境下Go编译报错:'sql.h' file not found 排查求助
我之前在Apple Silicon的Sequoia机器上编译Go的ODBC项目时也碰到过一模一样的问题,折腾了好一阵才搞定,给你分享几个亲测有效的排查和解决思路:
先确认unixODBC的安装状态与路径一致性
先运行brew info unixodbc,对比另一台正常Mac的安装版本,有时候版本差异会导致默认路径变化。你提到的/opt/homebrew/Cellar/unixodbc/2.3.12/include/sql.h路径,先手动确认这个文件确实存在且未损坏(比如可以用cat /opt/homebrew/Cellar/unixodbc/2.3.12/include/sql.h看看内容是否正常)。手动指定CGO头文件搜索路径
Go调用C代码(这里是odbc的底层API)时,默认的头文件搜索路径不会自动包含Homebrew安装的目录,所以编译前需要手动设置CGO_CFLAGS环境变量,把unixODBC的include目录加进去:export CGO_CFLAGS="-I/opt/homebrew/Cellar/unixodbc/2.3.12/include"之后再执行你的
make build命令;或者直接把变量和命令合并执行:CGO_CFLAGS="-I/opt/homebrew/Cellar/unixodbc/2.3.12/include" make build如果这个方法有效,你可以把这个环境变量写入shell配置文件(比如
~/.zshrc或~/.bash_profile),以后编译就不用每次手动输入了。修复Homebrew的链接状态
有时候Homebrew安装软件后可能未正确建立全局链接,运行brew link unixodbc检查状态,如果提示未链接或有冲突,可根据提示修复(比如在确认无依赖冲突的情况下添加--force选项)。对齐正常机器的CGO环境配置
在另一台能正常编译的Mac上执行echo $CGO_CFLAGS和echo $CGO_LDFLAGS,查看它的头文件、库文件搜索路径配置,然后将你的机器的环境变量设置为完全一致的内容。清理无效的软链接并检查vendor目录
你之前在/opt/homebrew/bin/下创建的sql.h软链接完全没用——bin目录是存放可执行文件的,不会被当作头文件搜索路径,建议删掉避免混淆。另外,检查项目的vendor目录是否和正常机器一致,若存在差异,可删除vendor后重新执行go mod vendor拉取依赖,或者直接用go mod tidy后不使用vendor编译尝试。完整指定CGO编译参数
如果上面的方法都无效,可以尝试同时指定头文件和库文件路径:export CGO_CFLAGS="-I/opt/homebrew/Cellar/unixodbc/2.3.12/include" export CGO_LDFLAGS="-L/opt/homebrew/Cellar/unixodbc/2.3.12/lib" make build
内容来源于stack exchange

