3XX*_*XX0 3 c++ shared-libraries go
我有一个项目,我想在C++应用程序中加载Go插件.
经过大量的研究,我不清楚Go是否支持这一点.我遇到了很多讨论指出动态链接的坏习惯,而不是IPC.此外,我不清楚语言是否打算动态链接(新的Go哲学?).
cgo提供了从C(Go内部)调用Go或Go调用C的能力,但不是来自普通C语言.或者是吗?
显然,上游也会发生一些事情(https://codereview.appspot.com/7304104/)
main.c中
extern void Print(void) __asm__ ("example.main.Print");
int main() {
Print();
}
Run Code Online (Sandbox Code Playgroud)
print.go
package main
import "fmt"
func Print() {
fmt.Printf("hello, world\n")
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
输出:
/usr/lib/libgo.so.3: undefined reference to `main.main'
/usr/lib/libgo.so.3: undefined reference to `__go_init_main'
Run Code Online (Sandbox Code Playgroud)
有解决方案吗?什么是最好的方法?分叉+ IPC?
参考文献:
我不认为你可以将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()
}
Run Code Online (Sandbox Code Playgroud)
main.c中
#include <stdio.h>
// Defined in Go
extern void Print(void);
// C Main program
int cmain() {
printf("Hello from C\n");
Print();
}
Run Code Online (Sandbox Code Playgroud)
print.go
package main
import "fmt"
import "C"
//export Print
func Print() {
fmt.Printf("Hello from Go\n")
}
Run Code Online (Sandbox Code Playgroud)
编译go build,并在运行时生成此输出
Hello from C
Hello from Go
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1732 次 |
| 最近记录: |