Общая библиотека в Go?

Можно ли создать общую библиотеку (.so) с помощью Go?

ОБНОВЛЕНО: для этого был создан issue.

Ответы

Ответ 1

Теперь можно использовать флаг -linkshared

Что вам нужно сделать, так это сначала запустить эту команду:

go install -buildmode=shared -linkshared  std

(Выше кода делает все общие пакеты доступными!) то

go install  -buildmode=shared -linkshared userownpackage

наконец, при компиляции кода, который вам нужно запустить:

go build -linkshared yourprogram

Чем выше это, тем лучше, чем статически связывать все, только динамически связывает их, и в итоге вы получите гораздо более мелкие скомпилированные файлы. Чтобы дать вам представление, мой файл "hello.go" со статическим связыванием составляет 2,3 МБ, а тот же код с использованием динамической компоновки - всего 12 КБ!

Ответ 2

Перейти к режимам выполнения описывает Building Go Packages как общую библиотеку:

"В этом режиме пакет Go или набор пакетов могут быть созданы как разделяемая библиотека. Программа Go, которая импортирует один или несколько из этих пакетов Go, может быть связана с этой общей библиотекой. между тем, как программа Go включена и время ее запуска, и общая библиотека, доступная при запуске программы, - это та, которая будет использоваться...

В версии Go 1.5 это реализовано только для цели linux-amd64. При использовании gccgo он реализуется для любой поддерживаемой цели.

Ответ 4

По-видимому, теперь это возможно, но только при очень точных обстоятельствах. Точнее, если вы пишете для платформы Android.

Проект "goandroid" на GitHub предоставляет набор исправлений, который позволяет Go для создания общей библиотеки для конкретного использования с Android NDK. См. https://github.com/eliasnaur/goandroid