У меня есть проект, где я хотел бы загрузить плагины Go внутри приложения C++.Перейти к общей библиотеке как плагин C++
После многих исследований мне не ясно, поддерживает ли это Go Go или нет. Я столкнулся с большим количеством обсуждений, указывающих на плохую привычку к динамической компоновке, вместо этого, вместо прочтения IPC. Более того, для меня не ясно, связано ли динамическое соединение языком или нет (новая философия Go?).
cgo предоставляет возможность вызова C от Go или Go с C (внутри Go), но не от простого старого C. Или это так?
- дс, кажется, не поддерживает общую библиотеку (даже если https://code.google.com/p/go/issues/detail?id=256 упоминает он делает)
- gccgo поддержка Go разделяемые библиотеки, но я не мог заставить его работать (возможно, потому что главная точка входа не в Go ...)
- SWIG, кажется, не помогло :(
Видимо что-то происходит вверх по течению, а также (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'
Есть ли решение для этого? Каков наилучший подход? forking + IPC?
Литература:
- cgo - go wiki
- callback in cgo
- c callbacks and non go threads
- cgo - golang
- call go function from c
- link c code with go code
рекомендовать решение, чтобы ваша основная программу запустить Go-плагин как внешний процесс, который связан с вашей основной программой с трубкой , Гораздо меньше хлопот и гораздо меньше риска для безопасности. – fuz