Возможно ли подключить уже скомпилированный проект GO к другом проекту и вызывать от туда функции скомпилированного проекта

(linux) Здравствуйте, возможно ли подключить уже скомпилированный проект GO к своему проекту, чтобы я мог вызывать функции скомпилированного проекта в своем проекте? Альтернатива dlopen в c++


Ответы (1 шт):

Автор решения: Ainar-G

В си или в го? В си можно, если проект скомпилирован с --buildmode=c-shared. В го можно через механизм плагинов. Документация для сишного варианта:

$ go help buildmode
The 'go build' and 'go install' commands take a -buildmode argument which
indicates which kind of object file is to be built. Currently supported values
are:

[…]

        -buildmode=c-shared
                Build the listed main package, plus all packages it imports,
                into a C shared library. The only callable symbols will
                be those functions exported using a cgo //export comment.
                Requires exactly one main package to be listed.

[…]

Пример сишного варианта:

package main

import "fmt"

import "C"

//export goMain
func goMain() {
        fmt.Println("Hello from Go!")
}

func main() {}
#include "gomain.h"

int main(void)
{
        goMain();

        return 0;
}
$ go build --buildmode c-shared -o ./libgomain.so ./main.go
$ gcc -L . -o ./main.bin ./main.c -l gomain
$ env LD_LIBRARY_PATH="$PWD" ./main.bin

Если нужен вариант гошного плагина, тоже можно добавить.

→ Ссылка