【发布时间】:2021-09-12 02:32:42
【问题描述】:
我想做一个简单的例子,用 CGO 从 Go 调用 C 代码。但由于某种原因,我无法达到预期。编译失败并出现以下错误:
go build main.go
# awesomeProject1/print
duplicate symbol '_do_print' in:
$WORK/b002/_x002.o
$WORK/b002/_x003.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
代码:
// print/print.c
#include <stdio.h>
void do_print(char * x){
printf("%s", x);
}
// print/print.go
package print
// #include <print.c>
import "C"
func DoPrint() {
C.do_print(C.CString("Hello!"))
}
// main.go
package main
import "awesomeProject1/print"
func main() {
print.DoPrint()
}
如果我将do_print 函数设为静态,它会编译,但我无法为稍后要集成的第 3 方代码执行此操作。
我是否遗漏了文档中的一些重要内容?教程都是相似的,并声称在我的示例失败的地方有效。请帮忙!
转到版本 1.16.4
【问题讨论】:
-
C 文件和 Go 文件都被编译,所以
print.c的内容被编译了两次。通常,包含.c文件是个坏主意。 -
我明白了!现在可以了。你想创建一个答案还是我应该?
-
我写了一个答案。我更详细地介绍了,因为我的评论并没有太多的答案。