При статической компоновке включает ли компоновщик всю библиотеку? - PullRequest
13 голосов
/ 10 марта 2012

Например, если я статически ссылаюсь на freeglut, включает ли компилятор все, начиная от freeglut, или только те части, которые я использую? Конечно, это подразумевает, что компоновщик (или компилятор?) Выполняет некоторый анализ зависимостей, чтобы выяснить, что он может безопасно исключить.

Если так, есть ли способ узнать, что было включено или исключено в Visual Studio?

Ответы [ 4 ]

7 голосов
/ 10 марта 2012

Отчасти это проблема качества реализации, но есть реальная ошибка.

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

Итак, чтобы гарантировать, что такие статические переменные не будут оптимизированы, с помощью стандартного инструментария связать егонеобходимо и достаточно для ссылки на что-либо в этом модуле компиляции.

Просмотр в Visual Studio того, что было включено, насколько я знаю, нет другого выхода, кроме как запросить подробный вывод из компоновщика, например, опция компоновщика /verbose:ref.

Однако с этой опцией вы получите действительно подробный вывод.

Альтернативой является запрос компоновщика для файла карты, например, опция компоновщика /map:blah.

Также этот вывод очень многословен.

6 голосов
/ 10 марта 2012

Да, компоновщик будет включать только единицы перевода, на которые ссылается ваш код.

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

4 голосов
/ 10 марта 2012

В компоновщике содержатся только те символы, которые необходимы.

Возможно, вопрос о проверке файлов * .lib отвечает на вторую часть (дампбин работает и для файлов * .exe).

0 голосов
/ 10 марта 2012

Я думаю, вы можете написать пример библиотеки, чтобы получить ответ. В C ++ lib, 1 написать класс для печати всего имени подкласса. 2 и несколько классов, полученных из него.

В настоящей основной программе просто используйте один из подклассов.

А затем напечатайте все имя.

Тогда вы найдете ответ, я думаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...