Golang中如何解决osx系统的_gostream符号重复问题

Golang中如何解决osx系统的_gostream符号重复问题 我在构建Go项目时遇到以下错误:

有谁知道如何解决这个问题。

/usr/local/go/pkg/tool/darwin_amd64/link: running clang failed: exit status 1
duplicate symbol _gostream in:
/var/folders/l6/xygpqgrx4vb7fw29h5cl_dmh0000gq/T/go-link-593658806/000018.o
/var/folders/l6/xygpqgrx4vb7fw29h5cl_dmh0000gq/T/go-link-593658806/000028.o
duplicate symbol _gosource in:
/var/folders/l6/xygpqgrx4vb7fw29h5cl_dmh0000gq/T/go-link-593658806/000018.o
/var/folders/l6/xygpqgrx4vb7fw29h5cl_dmh0000gq/T/go-link-593658806/000028.o
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

更多关于Golang中如何解决osx系统的_gostream符号重复问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

感谢更新。那么你是怎么解决这个问题的呢?

更多关于Golang中如何解决osx系统的_gostream符号重复问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


好的,我搞定了——顺便说一下,这是通知库的一个问题。

你好 @gyaan 我也遇到了类似的问题,你找到问题来源的线索了吗?

谢谢

我需要更新 github.com/rjeczalick/notify (go get -u github.com/rjeczalick/notify) 并在 vendor/ 文件夹内更新它(在我的项目中使用了 govendor,所以命令是 govendor update github.com/rjeczalick/notify)。

func main() {
    fmt.Println("hello world")
}

这个问题通常是由于在同一个Go项目中重复链接了相同的C语言符号导致的。_gostream_gosource是CGO中常见的符号名,当多个包或文件定义了相同的C函数时就会出现这种重复符号错误。

以下是几种解决方案:

1. 检查CGO代码中的重复定义

确保没有在多个地方定义相同的C函数。例如,检查是否有多个文件包含类似这样的代码:

// 文件1.go
/*
#include <stdio.h>
extern void gostream() {
    // 实现
}
*/
import "C"

// 文件2.go  
/*
#include <stdio.h>
extern void gostream() {  // 重复定义!
    // 另一个实现
}
*/
import "C"

2. 使用条件编译

如果确实需要在不同文件中使用相同的函数名,可以使用条件编译:

// 文件1.go
// +build implementation1

/*
#include <stdio.h>
extern void gostream() {
    // 实现1
}
*/
import "C"

// 文件2.go
// +build implementation2

/*
#include <stdio.h>
extern void gostream() {
    // 实现2
}
*/
import "C"

3. 检查第三方依赖

如果问题来自第三方库,检查是否同时导入了多个版本或冲突的C依赖:

import (
    _ "github.com/some/cgo-library1"  // 可能包含_gostream定义
    _ "github.com/another/cgo-library2" // 可能也包含_gostream定义
)

4. 清理并重新构建

有时临时文件可能导致问题:

go clean -cache
go clean -testcache
rm -rf /var/folders/l6/xygpqgrx4vb7fw29h5cl_dmh0000gq/T/go-link-*
go build

5. 检查CGO编译标志

确保没有重复的编译标志:

// #cgo CFLAGS: -I/path/to/include
// #cgo LDFLAGS: -L/path/to/lib -lsomelib

最常见的解决方法是检查代码中是否有重复的C函数定义,特别是当项目包含多个CGO文件时。建议逐个注释掉可能的冲突文件来定位问题源。

回到顶部