gpt4 book ai didi

go - 如何在 C 的多个包中重用 Go 回调?

转载 作者:IT王子 更新时间:2023-10-29 01:39:39 25 4
gpt4 key购买 nike

有没有一种方法可以构建一个 Go + C 应用程序:

  • 从主包 X 导入包 Y 和 Z。
  • 包 M 导出一个 go 回调 F。
  • 包 X 和 Y 都是用附带的 C 文件构建的,都需要从 C 源代码调用 F。

一般来说,我正在尝试弄清楚如何从用于构建最终应用程序的其他模块中的随附 C 文件调用回调。我不知道如何实现这个或类似的东西。我也对复杂的解决方案感兴趣。

最佳答案

我没有看到跨包调用 Go 函数的方法,但是所有 cgo 包都链接到同一个二进制文件中并且可以相互调用。这意味着您可以将 M.F 导出到包 M 中的 C 函数,并从包 Y 和 Z 中调用该 C 函数。

m/m.go:

package m

// void F();
import "C"
import "fmt"

//export F
func F() {
fmt.Println("m.f")
}

米/米.小时:

void m_f();

m/m.c:

#include <stdio.h>
#include "_cgo_export.h"
#include "m.h"

void m_f() {
printf("m_f\n")
F();
}

y/y.go:

package y

// The LDFLAGS lines below are needed to prevent linker errors
// since not all packages are present while building intermediate
// packages. The darwin build tag is used as a proxy for clang
// versus gcc because there doesn't seem to be a better way
// to detect this.

// #cgo darwin LDFLAGS: -Wl,-undefined -Wl,dynamic_lookup
// #cgo !darwin LDFLAGS: -Wl,-unresolved-symbols=ignore-all
// #include "y.h"
import "C"

import (
"fmt"
_ "m"
)

func Y() {
fmt.Println("y.Y")
C.y()
}

y/y.h:

void y();

y/y.c:

#include <stdio.h>
#include "../m/m.h"

void y() {
printf("y.C.y\n");
m_f();
}

关于go - 如何在 C 的多个包中重用 Go 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29056808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com