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
感谢更新。那么你是怎么解决这个问题的呢?
更多关于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文件时。建议逐个注释掉可能的冲突文件来定位问题源。

