使用cgo时的多重定义

时间:2019-10-29 11:49:11

标签: go cgo

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”行,则编译成功。

1 个答案:

答案 0 :(得分:1)

此行为已记录为here

  

在文件中使用// export会对序言进行限制:由于将其复制到两个不同的C输出文件中,因此它不得包含任何定义,而只能包含声明。如果文件同时包含定义和声明,则两个输出文件将产生重复的符号,并且链接器将失败。为避免这种情况,必须将定义放在其他文件或C源文件的前言中。