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“行,它将成功编译。
发布于 2019-10-29 20:28:04
此行为已记录在here中
在文件中使用//
对前导码有一个限制:因为它被复制到两个不同的C输出文件中,所以它不能包含任何定义,只能包含声明。如果文件同时包含定义和声明,则两个输出文件将生成重复的符号,链接器将失败。为了避免这种情况,必须将定义放在其他文件的前导中,或者放在C源文件中。
发布于 2021-11-09 20:56:15
如果你不介意重复的代码,这里有一个丑陋的变通方法:
package main
/*
__attribute__((weak))
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() {
}
IIUC __attribute__((weak))
告诉链接器忽略重复的定义。
https://stackoverflow.com/questions/58606884
复制相似问题