2009-11-18 8 views

ответ

13

Это теперь возможно с помощью -linkshared флаг

Что вам нужно сделать, это сначала выполнить следующую команду: (! Над кодом делает все общие пакеты разделяемыми)

go install -buildmode=shared -linkshared std 

затем

go install -buildmode=shared -linkshared userownpackage 

окончательно при составлении кода, который необходимо запустить:

go build -linkshared yourprogram 

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

+1

Правильный ответ. – 0x90

+0

вот что я искал. Но дает '-buildmode = shared не поддерживается на darwin/amd64' на моем mac. – lvle

3

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

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

+1

Как сейчас (июль 2013 г.), это расширение для Go Tools и не встроено в инструменты Go, которые отправляет Google. – Nate

+0

@Nate вы можете ссылаться на расширение? Является ли (автономное) расширение пригодным для использования только на андроиде или оно доступно для использования на рабочем столе? –

+0

@mihaistancu Я предполагаю, что было бы непросто перекрестно скомпилировать go для android, см. [Здесь] (https://jasonplayne.com/programming-2/how-to-cross-compile-golang-for-android). В ближайшее время можно получить официальную поддержку, учитывая, что golang 1.5 поддерживает iOS. – Nate

5

Go Execution Modes описывает Building Go пакеты в качестве общей библиотеки:

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

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

+0

Я тоже вернулся к этому вопросу, чтобы написать обновление. +1 –