2011-01-09 3 views

ответ

2

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

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

Большинство компоновщиков имеют возможность автоматически исключать неиспользуемые библиотеки, поэтому вы можете просто включить этот параметр, чтобы он заботился о вас.

Примечание: в некоторых редких случаях код запуска библиотеки может иметь некоторый важный эффект, и в этом случае вы не должны его исключать. Это то, что лучше всего определить, проверяя документацию библиотеки; подобные вещи должны (надеюсь)! быть четко документированы.

4

Хороший C++ компоновщик не будет включать вызовы из каких-либо библиотек, которые не используются в коде (так называемый ¨dead-code stripping ¨).

Итак, я бы сказал, что это зависит от того, какой компоновщик C++ вы используете, чтобы испустить окончательный выпуск. Возможно, вам нужно обратиться к документации вашего линкера, чтобы получить информацию об удалении кода. Если это не так, то это определенно поможет уменьшить конечный объем памяти в памяти.

Приветствия и надеюсь, что информация поможет!

-1

Да, всегда лучше исключать ненужные библиотеки.

1

Это не должно иметь значения.

Любой линкер любого достоинства не будет содержать ничего из библиотек, которые не являются (прямо или косвенно), на которые ссылается приложение, даже если эти библиотеки указаны в командной строке.
Единственными причинами включения (части) библиотеки являются: - Приложение использует функцию или глобальный объект из библиотеки . Часть библиотеки, которая была включена для разрешения некоторых ссылок, имеет ссылку на функцию или глобальный объект этой библиотеки.

Компонент не просто слепо помещает все вещи, которые вы предоставляете вместе в приложении, но делает различие между объектными файлами (для приложения) и библиотеками.
Линкера сначала собирает все объектные файлы и разрешает столько ссылок, которые сделаны между файлами.
После этого компоновщик проходит через указанные библиотеки и берет из каждой библиотеки те части, которые необходимы для разрешения (известных) неразрешенных ссылок. Это может создать новые нерешенные ссылки из-за зависимостей между библиотеками. Большинство линкеров сделает только один проход по библиотекам, но некоторые из них могут выполнять несколько проходов для разрешения всех ссылок. Части библиотек, которые не нужны для разрешения ссылки, не включены в исполняемый файл.

+1

Я думаю, что в лучшем случае это вводит в заблуждение и в моем опыте с инструментальной цепочкой GNU для кросс-компиляции просто неверно. – Tod

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