Что в .lib файле библиотеки Static, Статически связал динамическую библиотеку и динамично связал динамическую библиотеку?
Каким образом нет никакой потребности в .lib файле в динамично связанной динамической библиотеке и также что в статическом подключении, .lib файл является только .obj файлом со всеми методами. Это корректно?
Для статической библиотеки файл .lib содержит весь код и данные библиотеки. Затем компоновщик определяет нужные ему биты и помещает их в конечный исполняемый файл.
Для динамической библиотеки файл .lib содержит список экспортируемых функций и элементов данных из библиотеки, а также информацию о том, из какой DLL они были получены. Когда компоновщик собирает конечный исполняемый файл, если используется какая-либо из функций или элементов данных из библиотеки, он добавляет ссылку на DLL (заставляя ее автоматически загружаться в Windows) и добавляет записи в таблицу импорта исполняемого файла, чтобы вызов функции перенаправлялся в эту DLL.
Для использования динамической библиотеки не нужен файл .lib, но без него вы не сможете рассматривать функции из DLL как обычные функции в своем коде. Вместо этого вы должны вручную вызвать LoadLibrary
, чтобы загрузить DLL (и FreeLibrary
, когда закончите), и GetProcAddress
, чтобы получить адрес функции или элемента данных в DLL. Затем необходимо привести возвращаемый адрес к соответствующему указателю на функцию, чтобы использовать его.
В статической библиотеке файл lib содержит фактический объектный код для функций, предоставляемых библиотекой. В общей версии (которую вы назвали статически связанной динамической библиотекой) кода как раз достаточно для установления динамической связи во время выполнения.
Я не уверен насчет «динамически подключаемых динамических библиотек» (загружаемых программно). Вы вообще связываетесь с .lib в этом случае?
Edit:
Немного поздно, но нет, вы не связываете .lib. Ну, вы связываетесь с библиотекой, в которой есть libraryloaderex. Но для реальной библиотеки, которую вы используете, вы предоставляете свои собственные привязки через указатели функций C, и loadlibrary заполняет их.
Вот краткое изложение:
Linking ǁ Static | DLL | LoadLibrary =========ǁ===============|======================|=================== API code ǁ In your com- | In the DLL | In the DLL lives ǁ piled program | | ---------ǁ---------------|----------------------|------------------- Function ǁ Direct, may | Indirect via table | Indirect via your calls ǁ be elided | filled automatically | own function ptrs ---------ǁ---------------|----------------------|------------------- Burden ǁ Compiler | Compiler/OS | You/OS
В dll "вещи" такие же, как и в exe (могут быть любые данные, импорт, экспорт, чтение/запись/исполняемые секции), но разница в том, что exe-файл экспортирует только точку входа (функцию), а dll экспортируют одну/много функций.