首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用cgo时的多重清晰度

使用cgo时的多重清晰度
EN

Stack Overflow用户
提问于 2019-10-29 19:49:12
回答 2查看 1.7K关注 0票数 0
代码语言:javascript
运行
复制
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() {

}

编译程序:

代码语言:javascript
运行
复制
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“行,它将成功编译。

EN

回答 2

Stack Overflow用户

发布于 2019-10-29 20:28:04

此行为已记录在here

在文件中使用//

对前导码有一个限制:因为它被复制到两个不同的C输出文件中,所以它不能包含任何定义,只能包含声明。如果文件同时包含定义和声明,则两个输出文件将生成重复的符号,链接器将失败。为了避免这种情况,必须将定义放在其他文件的前导中,或者放在C源文件中。

票数 5
EN

Stack Overflow用户

发布于 2021-11-09 20:56:15

如果你不介意重复的代码,这里有一个丑陋的变通方法:

代码语言:javascript
运行
复制
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))告诉链接器忽略重复的定义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58606884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档