如何将 Go 静态库链接到 C 程序

问题描述 投票:0回答:1

我正在尝试从 C 程序调用 Go 函数。我已经从我的 Go 源代码构建了一个静态库,但是 ld 无法找到我想要从 C 程序调用的函数。

前往代码:

package main

import "fmt"
import "C"

// (this can be called anything)
// export goCallbackHandler
func goCallbackHandler() C.int {
    i := Hello()
    return C.int(i)
}

func Hello() int {
    fmt.Println("Hello, world!")
    return 0
}

func main() {
}

C代码: (主要.c)

#include "binding.h"

int main() {
     // Call the function from the binding
     return goCallbackHandler();
}

(绑定.h)

extern int goCallbackHandler();

我可以使用

go build -o libhello.a -buildmode=c-archive hello.go
成功构建库。然而,当我尝试使用
gcc -o hello main.c -L. -lhello
构建 C 部分时,我收到错误

main.c:(.text+0xe): undefined reference to `goCallbackHandler'
collect2: error: ld returned 1 exit status

来自

ld

go static-libraries ld cgo
1个回答
0
投票

空格很重要:导出注释需要是

//export
,而不是
// export
。您的版本实际上不导出任何内容。将导出注释固定为
//export goCallbackHandler
后,它按预期工作。

© www.soinside.com 2019 - 2024. All rights reserved.