package main
/*
int add(int a, int b) {
return a + b;
}
*/
import "C"
import "fmt"
func main() {}
func Test1() {
fmt.Println(C.add(1, 3))
}
//export Test2
func Test2() {
}
编译程序:
dingrui@dingrui-PC:~/Projects/gotest/array$ go build -o libtest.so -buildmode=c-shared main.go
# command-line-arguments
/tmp/go-build043762604/b001/_x002.o: In function `add':
./main.go:5: multiple definition of `add'
/tmp/go-build043762604/b001/_x001.o:/tmp/go-build/main.go:5: first defined here
collect2: error: ld returned 1 exit status
如果删除“ // export Test2”行,则编译成功。
答案 0 :(得分:1)
此行为已记录为here
在文件中使用// export会对序言进行限制:由于将其复制到两个不同的C输出文件中,因此它不得包含任何定义,而只能包含声明。如果文件同时包含定义和声明,则两个输出文件将产生重复的符号,并且链接器将失败。为避免这种情况,必须将定义放在其他文件或C源文件的前言中。