Как проще уменьшить размер библиотеки, выбрав только необходимые функции и удалив ненужные файлы?
Есть ли скрипт для выполнения этой задачи для библиотек c ++?
Возможно, вам следует сначала попытаться настроить компиляцию, чтобы минимизировать размер. И ответ на ваш вопрос во многом зависит от компилятора, компоновщика, какой операционной системы, флагов оптимизации и т. Д.
С недавним НКУ компилятор (g++
) на Linux, вы должны попытаться скомпилировать и ссылка с оптимизацией по размеру (-Os
) а также оптимизация времени соединения (-flto
).
Так ставь
CXX=g++ -flto -Os
в начале вашего Makefile
или просто беги make CXX='g++ -flto -Os'
после make clean
КСТАТИ, Clang / LLVM также знает о -flto
(и использует ЗОЛОТО как и GCC)
Обратите внимание, что общий библиотека (или, возможно, DLL в мире Microsoft) должен содержать весь код (именно потому, что он используется несколькими процессами и программами). Вы можете связать свою библиотеку статически (затем использовать g++ -flto -Os
как при сборке статической библиотеки, так и при связывании ее с основной программой)
Очень часто иметь общие библиотеки более целесообразно, чем пытаться уменьшить их пространство.
Если на Linux, прочитайте библиотека программ.
В типичных приложениях C ++ шаблоны обозначают большую часть функциональности (например, STL vector
, string
, так далее). Эти функции генерируются ТОЛЬКО в виде кода, когда они используются (хотя они МОГУТ генерироваться как встроенные функции, что в некоторых случаях может привести к большому коду).
Компоновщик будет «выбирать» только тот код, который необходим для вашего приложения (включая, конечно, функции, вызываемые используемыми вами функциями). Тем не менее, базовая среда выполнения, например, в Linux достаточно велика, потому что она вызывает много функциональности, которая, в свою очередь, использует немало других функций — поэтому ваш базовый размер исполняемого файла довольно велик. Добавление большего количества вашего собственного кода не приведет к значительному увеличению размера в типичном случае.
Если размер имеет решающее значение, то использование «небольшой библиотеки C ++», возможно, будет выбором — для разных ОС доступны разные такие библиотеки. Использование таких параметров, как -Os
чтобы компилятор сказал ему «сделать код маленьким» (другими словами, не вставляйте встроенные функции, если код не короче путем встраивания, чем при вызове функции, и не разворачивайте циклы и т. д., и т. д., но ДЕЛАЙТЕ встроенный функции вызываются только один раз, так как это делает код короче)
Если вы не хотите выполнять рефакторинг библиотеки (если у вас есть доступ к исходному коду, который не всегда является реалистичным гипотезой), стоит связать его как статическую библиотеку или скомпилировать как часть вашего приложения: все компиляторы выиграют от этого ,
Обратите внимание, что Clang обладает исключительным поведением в том смысле, что он может выполнять много оптимизаций во время статического связывания по сравнению с другими компиляторами.
Если вместо этого вам по какой-то причине придется использовать DLL, вы можете попытаться настроить видимость экспортируемых символов (вы можете скрыть символы, не видимые в клиентском коде, и экспортировать только те символы, которые вы используете): обратите внимание, что это может позволить некоторую оптимизацию в отношении скорости и двоичного кода. размер, но может быть утомительной работой (я бы посчитал это серьезным рефакторингом, потому что может сломать вещи).
Если вы используете контейнеры для внедрения зависимостей, вы, вероятно, можете использовать их для предупреждения о неиспользуемых зависимостях, чтобы вы могли легко их выводить без необходимости касаться исходного кода (вы выполняете некоторый рефакторинг контейнера, но не всей вашей кодовой базы), за исключением исходного кода. код в корне композиции.