Golang编译错误:gcc执行失败,exit status 1
Golang编译错误:gcc执行失败,exit status 1 go version go1.19.3 windows/amd64
我正在尝试使用这个支持数据库加密的 sqlite 包。
https://github.com/CovenantSQL/go-sqlite3-encrypt#installation
它说明我需要 “gcc”(我不知道那是什么)。
所以我下载了 “GCC 12.2.0” Winx64 版本,并将 “mingw64” 文件夹解压到 C 盘根目录。
https://winlibs.com/#download-release
然后我将其中的 bin 文件夹路径添加到了我的系统路径列表中。
我执行了:
go install github.com/CovenantSQL/go-sqlite3-encrypt
我按照指示在 “go env” 列表中设置了: CGO_ENABLED=1
当我尝试执行 “go run main.go” 时,现在出现了这个错误,我不知道它是什么意思。请协助 - 谢谢。
sqlite3-binding.c: In function 'sqlite3SelectNew':
sqlite3-binding.c:121469:10: warning: function may return address of local variable [-Wreturn-local-addr]
121469 | return pNew;
| ^~~~
sqlite3-binding.c:121431:10: note: declared here
121431 | Select standin;
| ^~~~~~~
# command-line-arguments
S:\Go\pkg\tool\windows_amd64\link.exe: running gcc failed: exit status 1
c:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[username]\AppData\Local\Temp\go-link-138338206\000015.o: in function `_cgo_preinit_init':
\\_\_\runtime\cgo/gcc_libinit_windows.c:40: undefined reference to `__imp___iob_func'
c:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[username]\AppData\Local\Temp\go-link-138338206\000015.o: in function `x_cgo_notify_runtime_init_done':
\\_\_\runtime\cgo/gcc_libinit_windows.c:105: undefined reference to `__imp___iob_func'
c:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[username]\AppData\Local\Temp\go-link-138338206\000015.o: in function `_cgo_beginthread':
\\_\_\runtime\cgo/gcc_libinit_windows.c:149: undefined reference to `__imp___iob_func'
c:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\[username]\AppData\Local\Temp\go-link-138338206\000016.o: in function `x_cgo_thread_start':
\\_\_\runtime\cgo/gcc_util.c:18: undefined reference to `__imp___iob_func'
collect2.exe: error: ld returned 1 exit status
package main
import (
"database/sql"
"log"
_ "github.com/CovenantSQL/go-sqlite3-encrypt"
)
func main() {
db, err := sql.Open("sqlite3", "file:Directory.db?_crypto_key=blahblah")
if err != nil {
log.Fatal(err)
}
defer db.Close()
}
更多关于Golang编译错误:gcc执行失败,exit status 1的实战教程也可以访问 https://www.itying.com/category-94-b0.html
go install 返回了什么?
如果改为运行 go get 是否效果更好?
我这样问是因为 Go 库包通常是通过 go get 获取的。
更多关于Golang编译错误:gcc执行失败,exit status 1的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
谢谢,我会看看那个。不过我怀疑它缺少我特别需要的数据库加密功能。
所以我不太确定如何最好地进行下去。我可能会遇到其他需要的包,但它们需要这个 cgo 的东西,所以也许我现在就学习它是最好的。
有没有在 Windows 上设置这个的指南?或者在不同的操作系统上开发应用程序会更好?最终我的目标平台是 Windows,所以我可能还是会遇到同样的问题。
找到了这个: https://pkg.go.dev/github.com/Daskott/gorm-sqlite-cipher#section-readme
我会试试那个。
您尝试使用的库需要可用的C工具链,因为它使用了“CGO”。在Windows上配置这些并不简单。
如果无法使用WSL,您应该使用一个无需CGO的SQLite驱动。在我的首选搜索引擎上,第一个结果是:
sqlite package - modernc.org/sqlite - Go Packages
Package sqlite is a sql/database driver using a CGo-free port of the C SQLite3 library.
对于任何感兴趣的人。我想(但愿如此)我已经让这个 gcc 的东西正常工作了。
TDM-GCC 10.3.0 现已发布,同时包含 GDB 10.2、binutils 2.36.1,以及新版本的 MinGW.org 和 MinGW-w64 运行时发行版。感谢您的耐心…
- 下载标记为“64+32-bit MinGW-w64 edition”的 exe 文件
- 使用所有默认选项安装它(下一步,下一步,完成)
- 如果 VSCode 已经打开,请关闭/重新打开它,以便它能够使用安装程序创建的新路径变量
基于此处找到的指南:
GitHub - mattn/go-sqlite3: 使用 database/sql 的 go sqlite3 驱动
用于 go 的 sqlite3 驱动,使用 database/sql。通过在 GitHub 上创建帐户为 mattn/go-sqlite3 开发做出贡献。
这个错误是因为 MinGW 版本与 Go 的 CGO 不兼容导致的。__imp___iob_func 引用问题通常出现在较新的 MinGW 版本中。以下是解决方案:
解决方案
1. 使用兼容的 MinGW 版本
下载旧版 MinGW-w64(推荐 8.1.0 版本):
# 下载地址:https://winlibs.com/#download-release
# 选择 "GCC 8.1.0 + LLVM/Clang/LLD/LLDB 6.0.0" 版本
2. 或者使用 MSYS2 安装 MinGW-w64
# 安装 MSYS2:https://www.msys2.org/
# 在 MSYS2 终端中执行:
pacman -S mingw-w64-x86_64-gcc
3. 设置正确的环境变量
确保环境变量设置正确:
# 设置 CGO 相关环境变量
set CGO_ENABLED=1
set CC=gcc
set CXX=g++
# 对于 64 位系统,确保使用正确的架构
set GOARCH=amd64
4. 验证安装
创建测试文件验证 GCC 是否正确安装:
// test_cgo.go
package main
// #include <stdio.h>
import "C"
func main() {
C.puts(C.CString("CGO test successful"))
}
运行测试:
go run test_cgo.go
5. 如果仍然失败,尝试指定链接器标志
在你的代码中添加构建约束:
// main.go
//go:build cgo
// +build cgo
package main
import (
"database/sql"
"log"
_ "github.com/CovenantSQL/go-sqlite3-encrypt"
)
func main() {
db, err := sql.Open("sqlite3", "file:test.db?_crypto_key=testkey123")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// 测试连接
err = db.Ping()
if err != nil {
log.Fatal(err)
}
log.Println("Database connected successfully")
}
6. 使用特定构建标签编译
# 使用 cgo 标签编译
go build -tags cgo main.go
# 或者直接运行
go run -tags cgo main.go
7. 替代方案:使用预编译版本
如果 GCC 问题持续存在,可以考虑使用纯 Go 的 SQLite 驱动:
// 使用 mattn/go-sqlite3 的替代方案
import (
"database/sql"
_ "modernc.org/sqlite" // 纯 Go 实现,无需 CGO
)
func main() {
db, err := sql.Open("sqlite", "test.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
}
验证步骤
- 检查 GCC 版本:
gcc --version
- 检查 Go 环境:
go env CGO_ENABLED CC
- 清理并重新构建:
go clean -cache
go mod tidy
go build -v
主要问题是 MinGW 12.2.0 版本与 Go 的 CGO 运行时存在兼容性问题。降级到 MinGW 8.1.0 或使用 MSYS2 的 MinGW-w64 通常可以解决这个问题。

