Этапы компиляции в Си/С++

Такой общий вопрос, если не сложно подскажите пожалуйста: вот предположим у меня в коде у проекту подключена внешняя .lib библиотека и у нее есть 5 .h файлов соответствующих 5 функциям, в коде у меня подключен этот .lib файл и include <func1.h>, так как я использую только одну функцию из библиотеки.

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

И вопрос собственно такой: если все вышеописанное более менее правильно, то компоновщик добавляет вест .lib файл или только часть, которая соответствует подключенному func1.h ?


Ответы (2 шт):

Автор решения: Andrej Levkovitch

.lib - расширение для статических библиотек, а статические библиотеки служат такими архивами скомпилировпнных функций. Компановщик лишь достанет из этого архива те функции, которые вы ИСПОЛЬЗОВАЛИ в коде. Таким образом статические библиотеки - способ создать минимальные по весу прогаммы с минимум зависимостей от других библиотек.

→ Ссылка
Автор решения: user7860670

Файлы с расширением .lib используются для:

Библиотек импорта (stubs), содержащих ссылки на .dll для добавления в таблицу импорта получаемого исполняемого файла. При сборке компилятор сначала составляет перечень методов, реализация которых отсутствует в собираемом исполняемом файле (undefined references), а затем пытается заполнить его из .lib файла.

Библиотек статических, содержащих промежуточное представление кода в объектных файлах для добавления непосредственно в исполняемый файл; При сборке эти объектные файлы добавляются к единицам трансляции собираемого исполняемого файла. Добавляется ли из объектных файлов все или только нужное - задается параметрами сборки. На это влияют следующие настройки:

  • /GL (опция компилятора) /LTCG (опция линкера) - whole program optimization - генерация машинного кода откладывается до этапа линковки. Включение этой опции на этапе компиляции дает возможность компилятору оптимизировать (в т.ч. встраивать) код исполняемого файла и статической библиотеки непосредственно при линковке, а не в рамках каждой отдельной единицы трансляции. Чтобы это работало должны быть выставлены обе опции.
  • /OPT:REF (опция линкера) - непосредственно включает выкидывание функций, которые нигде не используются
  • /INCLUDE (опция линкера) - запрещает выкидывание определенного символа (функции или объекта), даже если те не используются.
→ Ссылка