2015-09-17 6 views
4

Я искал последние сведения о создании компактных Go исполняемых файлов, без успеха. Большая часть информации, кажется, несколько лет.Golang размер исполняемого файла

Моя программа: стандартный мир привет, найденный на Rosettacode.org. С Fortran я получаю exe-файл под 100 КБ. С Go exe-файл имеет колоссальный 2400 КБ.

Мои вопросы: есть ли переключатели компилятора или прагмы, которые я должен использовать? Есть ли другие инструменты или трюки, о которых я не знаю (я начинаю с Go). Каковы будущие планы Go относительно размера исполняемого файла? Что это такое под Linux - то же самое? Что происходит с файлами exe на больших программах?

Фон: Я использую go 1.5, установленный в Windows 7. Мой проект записывает (фактически переносит с других языков) некоторые программы командной строки. Имея 20 или более больших файлов Go exe, вы съедаете много места. Хорошо, я знаю, что пространство дешево, поэтому я могу жить с ним. Однако я считаю, что ясность в этом вопросе поможет многим людям.

+3

Не уверен, что SE является подходящим местом для обсуждения стольких вопросов. Возможно, более подходящим будет список рассылки Go. –

+0

Я буду рад услышать о переключателях компилятора или прагмах, особенно если они не были хорошо документированы. – Fred

+3

Прочитайте это: [Причина огромного размера скомпилированного исполняемого файла Go] (http://stackoverflow.com/questions/28576173/reason-for-huge-size-of-compiled-executable-of-go). Исполняемый файл Go большой, потому что он содержит среду выполнения с поддержкой gc и отражения во время выполнения. Fortran exe не предоставляет это вам (или уровень, сопоставимый с уровнем Go). Не волнуйтесь, время выполнения добавляется только один раз, если ваш код растет, он не будет линейным по размеру вывода. – icza

ответ

4

Программа A Go является большой, поскольку содержит код коллаборации мусора, код планирования goroutine и, кроме того, он имеет почти все библиотеки, статически связанные. Это так по дизайну.

FAQ Why is my trivial program such a large binary

2

Чтобы уменьшить размер исполняемого файла, вы можете поручить линкер раздеться символы отладки с помощью одного из следующих действий:

go install -ldflags '-s' 
go install -ldflags '-s -w' 

Я попробовал его на достаточно большой исполняемый файл (один из GXUI), и это уменьшило его с ~ 16M до ~ 10M. Добавление -w в -s не имело никакого значения, но как всегда, ваш пробег может варьироваться ...

Here - это полный список всех вариантов компоновщика.

+0

Обратите внимание, что это то же самое, что и 'strip' на двоичном. – Carpetsmoker

+1

@Carpetsmoker: совсем нет - в методе, рекомендованном мной, символы лишаются компоновщиком Go, который гораздо более надежен работать надежно, чем сторонняя утилита, такая как 'strip'. Это не так уж и странно, по-видимому, 'strip' создавал проблемы с двойными файлами Go в прошлом - см. [Здесь] (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=717172) (цитата: «удаление дескриптора go будет производить где угодно: от нет, до тонкого, до полного сбоя выполнения») – rob74

+0

Ah; Спасибо за разъяснения; он имеет * тот же эффект *, как работает 'strip' на двоичном :-) – Carpetsmoker

Смежные вопросы