
本文旨在解决在使用 Go 语言在 macOS 10.9 系统上编译包含 C 代码的包时遇到的 `clang` 编译器错误。该错误与 `-fno-eliminate-unused-debug-types` 参数有关,并且添加 `-Qunused-arguments` 编译选项会导致 `cgo` 无法识别 C 类型。本文将提供两种解决方案:升级 Go 版本到 1.2 或更高版本,或者手动修改 `cgo` 的源码以移除导致错误的编译选项。
在使用 Go 语言开发时,有时需要调用 C 语言编写的库或代码。cgo 是 Go 语言提供的一种机制,允许在 Go 代码中嵌入 C 代码。然而,在 macOS 10.9 系统上,使用 cgo 编译 C 包时可能会遇到一些问题,特别是与 clang 编译器相关的错误。本文将介绍这些问题以及相应的解决方案。
问题描述
在 macOS 10.9 上,尝试编译包含 C 代码的 Go 包时,可能会遇到以下错误:
clang: error: argument unused during compilation: '-fno-eliminate-unused-debug-types'
这个错误表明 clang 编译器不接受 -fno-eliminate-unused-debug-types 这个参数。尝试添加 -Qunused-arguments 编译选项来解决这个问题,可能会导致另一个错误:
could not determine kind of name for C.
这个错误表明 cgo 无法识别 C 语言的类型。
解决方案
这个问题是 Go 语言 cgo 工具的一个已知 bug,通常在 Go 1.2 版本中已经修复。因此,有两种解决方案:
1. 升级 Go 版本
最简单的解决方案是将 Go 语言升级到 1.2 或更高版本。你可以从 Go 官方网站下载最新版本的 Go 并进行安装。升级后,重新编译你的 Go 包,应该可以解决这个问题。
2. 修改 cgo 源码
如果由于某些原因无法升级 Go 版本,可以手动修改 cgo 的源码来移除导致错误的编译选项。
步骤如下:
找到 gcc.go 文件。该文件位于 Go 语言安装目录的 src/cmd/cgo/ 目录下。例如,如果 Go 安装在 /usr/local/go 目录下,那么 gcc.go 文件的路径就是 /usr/local/go/src/cmd/cgo/gcc.go。
使用文本编辑器打开 gcc.go 文件。
搜索 -fno-eliminate-unused-debug-types 字符串。
-
找到包含该字符串的行,并将其从编译选项列表中删除。例如,该行可能类似于:
var defaultCCFlags = []string{"-fno-eliminate-unused-debug-types"}将其修改为:
var defaultCCFlags = []string{}或者直接删除该选项。
保存修改后的 gcc.go 文件。
注意事项:
- 修改 cgo 源码需要管理员权限。
- 修改 cgo 源码可能会影响其他 Go 包的编译,因此请谨慎操作。
- 建议在修改 cgo 源码之前备份原始文件。
- 修改 cgo 源码后,需要重新编译 Go 包才能生效。
示例代码 (修改 gcc.go 后的编译过程)
假设你的Go包目录结构如下:
myproject/ ├── main.go └── c_library.c
main.go 内容如下:
package main
/*
#cgo CFLAGS: -I.
#include "c_library.c"
*/
import "C"
import "fmt"
func main() {
result := C.add(1, 2)
fmt.Println("Result:", result)
}c_library.c 内容如下:
#includeint add(int a, int b) { return a + b; }
在修改了 gcc.go 文件后,可以使用 go build 命令编译该包:
go build
如果编译成功,将生成一个可执行文件。
总结
在 macOS 10.9 上使用 Go 语言编译包含 C 代码的包时,可能会遇到 clang 编译器错误。这个问题可以通过升级 Go 版本或手动修改 cgo 源码来解决。建议优先选择升级 Go 版本,因为这是最简单且最可靠的解决方案。如果无法升级 Go 版本,可以尝试修改 cgo 源码,但请务必谨慎操作。解决此问题后,你就可以顺利地在 macOS 10.9 上使用 Go 语言调用 C 代码了。










