Go共享库作为c++插件
Go shared library as C++ plugin
我有一个项目,我想在一个c++应用程序内加载Go插件。
经过大量的研究,我不清楚Go是否支持这一点。我遇到了很多讨论,指出动态链接的坏习惯,而不是IPC。此外,我不清楚动态链接是否是语言的目的(新的Go哲学?)。
cgo提供了从Go调用C或从C(在Go内部)调用Go的能力,但不能从普通的旧C调用。
- gc似乎不支持共享库(即使https://code.google.com/p/go/issues/detail?id=256提到它) gccgo支持Go共享库,但我无法使其工作(可能是因为主要入口点不在Go中…)
- SWIG似乎也没有帮助:(
显然上游也发生了一些事情(https://codereview.appspot.com/7304104/)
c
extern void Print(void) __asm__ ("example.main.Print");
int main() {
Print();
}
print.go
package main
import "fmt"
func Print() {
fmt.Printf("hello, worldn")
}
Makefile:
all: print.o main.c
gcc main.c -L. -lprint -o main
print.o: print.go
gccgo -fno-split-stack -fgo-prefix=example -fPIC -c print.go -o print.o
gccgo -shared print.o -o libprint.so
输出:/usr/lib/libgo.so.3: undefined reference to `main.main'
/usr/lib/libgo.so.3: undefined reference to `__go_init_main'
有解决方案吗?最好的方法是什么?
引用:
- go - go wiki
- 回调
- c回调和非go线程
- go - golang
- 从c 调用go函数
- 链接c代码与go代码
我不认为你可以把Go嵌入到C中,但是你可以把C嵌入到Go中,然后用一个小的存根C程序,你可以首先调用C,这是下一个最好的事情!Cgo绝对支持与共享库的链接,所以这个方法可能对你有用。
这样的main.go
// Stub go program to call cmain() in C
package main
// extern int cmain(void);
import "C"
func main() {
C.cmain()
}
c
#include <stdio.h>
// Defined in Go
extern void Print(void);
// C Main program
int cmain() {
printf("Hello from Cn");
Print();
}
print.go
package main
import "fmt"
import "C"
//export Print
func Print() {
fmt.Printf("Hello from Gon")
}
使用go build
编译,并在运行它时产生以下输出
Hello from C
Hello from Go
抱歉,您不能使用'gc' ATM将Go包编译为共享库,将来可能会更改。可能有一些机会与'gccgo'作为'libgo' (Go运行时,我想)是一个共享库已经。我猜缺失的部分,然后只有正确初始化运行时,这通常是一个Go命令自动处理。
gccgo专家是I.L. Taylor,几乎每天都可以在golang-nuts的邮件列表中找到他。我建议你直接问他。
PS:其他问题可能包括Go垃圾收集器和(c++)进程内存等的交互。也许我太乐观了,根本行不通。
相关文章:
- 从C++本机插件更新Vector3数组
- 使用CMake创建QML插件
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- clang 插件:在编译过程中修改 AST
- 实现动态插件管理器
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- Agora.io 虚幻引擎插件构建错误
- 使用带有C++对象和标准库容器的插件系统
- 运行命令 "rosbag play example.bag" 时出错。找不到与插件 rosbag/NoEncryptor 对应的库
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 通过 Gazebo 世界插件将静态对象附加到机器人链接
- 如何为模块化应用程序实现C++插件系统
- 'string'文件在带有C++文件的iOS插件上找不到
- 在 Android 上安装 GStreamer 插件
- 如何使用MSVC 2019创建和使用Qt 5.14.0自定义小工具插件
- 如何在 Windows 操作系统中在 geany 中安装插件
- 节点插件 API 将数组作为函数参数传递
- OpenVINO - 推理库插件 libMKLDNNPlugin.so 无法解析依赖关系
- 通过 Flutter 从C++插件访问资产