Что является более простым способом уменьшить размер библиотеки, выбирая только необходимые функции и устраняя ненужные файлы? Есть ли сценарий для выполнения этой задачи для библиотек C++?C++ уменьшить размер библиотеки, исключая ненужные функции программно?
ответ
Если вы не хотите, чтобы библиотека использовала тяжелый рефакторинг (при условии, что у вас есть доступ к исходному коду, который не всегда является реалистичной гипотезой), следует связать его как статическую библиотеку или скомпилировать как часть вашего приложения: все компиляторы выиграет от этого.
Обратите внимание, что Clang имеет исключительное поведение в том смысле, что он способен делать много оптимизаций при статическом времени связывания по сравнению с другими компиляторами.
Если вам по какой-то причине нужно использовать DLL, вы можете попытаться настроить видимость экспортированных символов (вы можете скрыть символы, которые не видны в коде клиента и экспортировать только используемые вами символы): обратите внимание, что это может привести к некоторой оптимизации учитывая скорость и двоичный размер, но может быть утомительной работой (я бы назвал ее основным рефакторингом, потому что имеет потенциал для разрыва).
Если вы используете контейнеры для инъекций зависимостей, вы можете, вероятно, использовать их для предупреждения о неиспользуемых зависимостях, чтобы вы могли легко их вывести без необходимости касания исходного кода (вы делаете рефакторинг контейнера, но не весь ваш codebase), за исключением исходного кода в составе root.
GCC также может делать LTO. –
Да, но по-другому: GCC: https://gcc.gnu.org/wiki/LinkTimeOptimization Clang: http://llvm.org/docs/LinkTimeOptimization.html Это не сбрасывает некоторые внутренние состояния (на самом деле может быть больше деталей реализации, чем что-то актуальное) Я не говорю, что GCC не делает оптимизацию (и на самом деле все еще предпочитает GCC) – GameDeveloper
В типичных приложениях на C++ шаблоны поддерживают большую часть функциональности (например, STL vector
, string
и т. Д.). Эти функции ТОЛЬКО генерируются как код, когда они используются (хотя они МОГУТ быть сгенерированы как встроенные функции, которые в некоторых случаях могут привести к большому коду).
Линкером будет только «выбрать» код, необходимый для вашего приложения (включая, конечно, функции, называемые функциями, которые вы используете). Тем не менее, базовая среда выполнения, например Linux, довольно велика, потому что она называет большую функциональность, которая, в свою очередь, использует справедливый бит другой функции, поэтому ваш основной размер исполняемого файла довольно велик. Добавление большего количества вашего собственного кода не приведет к увеличению размера на значительное количество в типичном случае.
Если размер критический, то использование «небольшой библиотеки C++», возможно, будет выбором - для разных ОС существуют разные библиотеки. Использование таких параметров, как -Os
, для компилятора, чтобы сказать «сделать код маленьким» (другими словами, не выполнять встроенные функции, если код не короче путем встраивания, чем путем вызова функции, а также не разворачивать циклы и т. Д. и т. д., но DO встроенные функции вызываются только один раз, поскольку это делает код короче)
Почему все предполагают, что он использует GCC, он даже не упомянул компилятор. Насколько нам известно, он может использовать визуальную студию, которая по умолчанию создает несколько статических библиотек МБ даже для нескольких строк кода, если вы не играете с параметрами компилятора – GameDeveloper
Я не сделал такого предположения. gcc, clang или visual studio работают почти идентично, и все они имеют «оптимизацию для небольших размеров», используя '-Os' (как и armcc). Даже составитель/компоновщик Atari ST, который я использовал 30 лет назад, смог включить только те функции, которые фактически используются, поэтому я сомневаюсь, что любой другой компилятор, созданный с тех пор, как НЕ ... –
Вам, вероятно, следует сначала попытаться настроить свою компиляцию, чтобы минимизировать размер. И ответ на ваш вопрос во многом зависит от компилятора, компоновщика, какая операционная система, параметры оптимизации, и т.д. ...
С недавнего GCC компилятором (g++
) на Linux, вы должны попытаться собрать и ссылка с оптимизацией для размера (-Os
) и link time optimization (-flto
).
Так положил
CXX=g++ -flto -Os
вблизи начала вашего Makefile
или просто запустить make CXX='g++ -flto -Os'
после make clean
BTW, Clang/LLVM также знает о -flto
(и использует GOLD как GCC делает)
Примечание что общий library (или, возможно, DLL в мире Microsoft) должен содержать весь код (именно потому, что это общая ставка несколько процессов и программ). Вы можете связать свою библиотеку статически (затем используйте g++ -flto -Os
как при построении статической библиотеки, так и при ее привязке к основной программе)
Очень часто использование разделяемых библиотек более целесообразно, чем попытка уменьшить их пространство.
Если в Linux, прочитайте program library howto.
не знал о опции -flto, Я попытаюсь выдать запрос функции разработчикам 'Cmake' для его поддержки. – GameDeveloper
В LTA уже поддерживается поддержка 'cmake'.Вы можете просто попробовать «make clean», а затем «make CXX =» g ++ -flto -Os'' –
Для этого требуется ручное вмешательство для GCC, я имею в виду, что CMake уже использует автоматически определенные флаги компилятора (например, для GCC в Release build use -O3 ') действительно ли вы утверждаете, что' -flto' автоматически используется с некоторой конфигурацией сборки без указания вручную флажка? (с этим автоматическим было бы здорово, потому что вы получаете бесплатную оптимизацию, не имея при этом необходимости поддерживать отдельный флаг для GCC, который отлично подходит при компиляции библиотеки со многими зависимостями от 3 разных компиляторов и 10 версий компилятора). Вручную указывать флаги - это хорошо известный антипатман cmake – GameDeveloper
Коннекторы обычно пытаются автоматически определить, какие функции или, по крайней мере, файлы, достижимы и отбросить нежелательные. Проверьте свое руководство, чтобы узнать, как его настроить. Остерегайтесь того, что вещи все еще легко перетаскивать без необходимости, и если размер вызывает беспокойство, вы должны периодически смотреть на свой файл карты, чтобы узнать, что происходит на самом деле. Таблицы указателей/фабрик функций и т. П. Являются частыми виновниками, и заботиться о том, что вы экспортируете из динамически связанных библиотек. – doynax
** Почему ** вы спрашиваете? Каковы обстоятельства, требующие уменьшить размер библиотеки? Обычно это не имеет значения, потому что библиотеки разделяются! Пожалуйста, ** отредактируйте свой вопрос **, чтобы улучшить его, дать свои мотивы, контекст, какой компилятор, операционную систему, флаги оптимизации вы используете, что такое фактическая библиотека и т. Д. –
Почему? Линкеры не связывают ничего из библиотеки, недоступной. Какую проблему ты пытаешься решить? – EJP