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

5 回复

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驱动。在我的首选搜索引擎上,第一个结果是:

pkg.go.dev

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 图标

TDM-GCC 10.3.0 发布 | tdm-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 图标

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()
}

验证步骤

  1. 检查 GCC 版本:
gcc --version
  1. 检查 Go 环境:
go env CGO_ENABLED CC
  1. 清理并重新构建:
go clean -cache
go mod tidy
go build -v

主要问题是 MinGW 12.2.0 版本与 Go 的 CGO 运行时存在兼容性问题。降级到 MinGW 8.1.0 或使用 MSYS2 的 MinGW-w64 通常可以解决这个问题。

回到顶部