Вопрос, на самом деле, заключается не в выборе межу
LoadLibrary
и
#include
, а в выборе между явным и неявным
связыванием.
При неявном связывании
компоновщик добавляет в PE-секцию импорта дополнительный блок импорта конкретно указанной библиотеки. Этот блок обрабатывается загрузчиком PE в момент подготовки к запуску процесса. Эта информация тебе уже должна быть
знакома. К моменту передачи управления в точку входа процесса все неявно связанные библиотеки уже загружены и готовы к работе. Код процесса не нуждается в явном управлении загрузкой таких библиотек.
Явное связывание выполняется полностью кодом процесса, для чего и применяется
набор функций для работы с библиотеками. Явное связывание - это большая рутина. Но иногда без этой рутины никак.
Поиск динамических библиотек при работе
LoadLibrary
[
?] осуществляется в соответствии с определенным
порядком. При этом, путями для поиска динамических библиотек можно управлять в ручном режиме,
добавляя новые или
замещая имеющиеся пути поиска.
Директива препроцессора
#include
[
?] лишь косвенно относится к вопросу. На самом деле к вопросу относится директива
#pragma comment( lib )
[
?].
Прагма работает только для cl - компилятора от Microsoft. Подключаемая таким образом статическая библиотека должна находиться в перечисленных Library Path, в настройках сборки проекта. Эта прагма является альтернативой прямого указания статической библиотеки в настройках сборки проекта.
Эту директиву любят использовать в
сторонних заголовках, код для которых поставляется только в бинарном виде, в статических или динамических библиотеках. Вместе с динамической библиотекой такого решения поставляется и библиотека статическая, в которой находятся инструкции для неявного связывания с динамической библиотекой. Результатом работы
#pragma comment( lib )
с такой статической библиотекой будет неявное связывание твоего кода с указанной динамической библиотекой.
Размер PE ощутимо растет при компоновке из статических библиотек.
Явное и неявное связывание слабо влияют на размер PE, но явное связывание усложняет жизнь разработчика, т.к. поддерживать загрузку интерфейса библиотеки разработчику придется самому.