将共享库作为C ++插件

时间:2013-05-29 05:21:43

标签: c++ go shared-libraries

我有一个项目,我想在C ++应用程序中加载Go插件。

经过大量的研究,我不清楚Go是否支持这一点。 我遇到了很多讨论指出动态链接的坏习惯,而不是IPC。此外,我不清楚语言是否打算动态链接(新Go哲学?)。

cgo提供了从C(Go内部)调用Go或Go调用C的能力,但是不能从普通的旧C调用C.或者是吗?

显然,上游也会发生一些事情(https://codereview.appspot.com/7304104/

的main.c

extern void Print(void) __asm__ ("example.main.Print");

int main() {
        Print();
}

print.go

package main

import "fmt"

func Print() {
    fmt.Printf("hello, world\n")
}

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'

有解决方案吗?什么是最好的方法?分叉+ IPC?

参考文献:

2 个答案:

答案 0 :(得分:7)

我认为你不能将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()
}

<强>的main.c

#include <stdio.h>

// Defined in Go
extern void Print(void);

// C Main program
int cmain() {
  printf("Hello from C\n");
  Print();
}

<强> print.go

package main

import "fmt"

import "C"

//export Print
func Print() {
    fmt.Printf("Hello from Go\n")
}

使用go build进行编译,并在运行时生成此输出

Hello from C
Hello from Go

答案 1 :(得分:2)

AFAIK,你不能将Go包编译成共享库witg'gc'ATM,它将来可能会改变。 'gccgo'可能有一些机会作为'libgo'(我认为Go运行时)已经是一个共享库。我想缺失的部分只是正确初始化运行时,通常Go命令会自动处理。

gccgo专家是I.L.泰勒,几乎每天都可以在golang-nuts邮件列表中找到它。我建议直接问他。

PS:其他问题可能包括Go垃圾收集器和(C ++)进程内存等的交互。也许我太乐观了,但根本不可行。