Огромный статический файл библиотеки при компиляции с использованием VS2005, нормальный размер при компиляции с использованием gcc - PullRequest
5 голосов
/ 04 мая 2011

Я собираю статическую библиотеку, которая содержит в основном шаблонные классы. Когда это скомпилировано с использованием gcc, результирующий файл .a составляет около 40Мб. Это довольно много, но не совсем неожиданно из-за большого количества шаблонов. Однако, когда я компилирую тот же код с использованием VS2005, результирующий файл .lib приходит с (подождите!) 575Mb ..

Теперь, прежде чем я сгорел, я увидел: Как я могу получить ссылку на мою очень большую программу? , и это полезно для понимания того, что шаблоны потенциально делают библиотеки большими, но я пытаясь понять, почему выходные данные двух компиляторов так различаются по размеру?

VS варианты: (Debug)

/Od /D "WIN32" /D "_DEBUG" /D "_LIB" /D "_WIN32_WINNT=0x0500" /D "_MBCS" /Gm /EHsc /RTC1 /MDd /W4 /nologo /c /Wp64 /Zi /TP /errorReport:prompt

(Release)

/O2 /D "WIN32" /D "NDEBUG" /D "_LIB" /D "_WIN32_WINNT=0x0500" /D "_MBCS" /FD /EHsc /MD /W4 /nologo /c /Wp64 /Zi /TP /errorReport:prompt

Любые комментарии или указатели очень ценятся ..

1 Ответ

3 голосов
/ 04 мая 2011

Отладочная сборка отключает встраивание, а также параметры компоновщика, которые отбрасывают дублирующийся код, поэтому вы получаете множество копий каждого шаблона и встроенной функции.

Вы можете включить его с помощью /OPT:REF /OPT:ICF в параметрах компоновщика.Но это должно быть по умолчанию в сборке релиза.

К сожалению, я думаю, что это помогает только с вашим конечным исполняемым файлом, но не с промежуточной библиотекой.

Возможно, вы сможете сэкономить некоторое место явносоздание экземпляров шаблонов, которые вам нужны, в одном .cpp и использование extern template для предотвращения автоматического создания экземпляров при компиляции других исходных файлов.

...