Що знаходиться всередині файлу .lib статичної бібліотеки, статично пов'язаної динамічної бібліотеки та динамічно пов'язаної динамічної бібліотеки?


84

Що знаходиться всередині файлу .lib статичної бібліотеки, статично пов'язаної динамічної бібліотеки та динамічно пов'язаної динамічної бібліотеки?

Як так, немає необхідності у файлі .lib у динамічно пов'язаній динамічній бібліотеці, а також у тому, що при статичному зв'язуванні файл .lib - це не що інше, як файл .obj з усіма методами. Це правильно?


4
Можна відзначити, що питання стосується платформи MS Windows.
cubuspl42

Відповіді:


147

Для статичної бібліотеки файл .lib містить весь код та дані бібліотеки. Потім компонувальник визначає потрібні йому біти та поміщає їх до остаточного виконуваного файлу.

Для динамічної бібліотеки файл .lib містить список експортованих функцій та елементів даних із бібліотеки, а також інформацію про те, з якої DLL вони походять. Коли компонувальник створює остаточний виконуваний файл, тоді, якщо використовується якась із функцій або елементів даних з бібліотеки, тоді компонувальник додає посилання на DLL (внаслідок чого його автоматично завантажує Windows) і додає записи до таблиці імпорту виконуваного файлу, щоб що виклик функції перенаправляється в цю DLL.

Вам не потрібен файл .lib для використання динамічної бібліотеки, але без нього ви не можете розглядати функції з DLL як звичайні функції у вашому коді. Натомість вам потрібно зателефонувати вручну, LoadLibraryщоб завантажити DLL (і FreeLibraryколи закінчите) та GetProcAddressотримати адресу функції або елемента даних у DLL. Потім потрібно повернути повернену адресу до відповідного вказівника на функцію, щоб використовувати її.


4
Після довгих пошуків, IMO, я отримав найкращу відповідь з цієї причини, використовуючи lib & dll. Дякую
Джит

@Anthony Williams, коли ви сказали: "Для динамічної бібліотеки файл .lib містить список експортованих функцій та елементів даних з бібліотеки, а також інформацію про те, з якої бібліотеки DLL вони походять." - це той файл .lib, який називається "імпорт" бібліотека ", яка відрізняється від звичайних файлів .lib (" статична бібліотека ")?
starriet

Так, це бібліотека імпорту
Ентоні Вільямс,

13

Я знайшов наступну відповідь від Ганса, яка також тут була корисною: це очищає те, що там можуть бути два типи файлів lib.

Файл LIB використовується для побудови вашої програми, він існує лише на вашій машині збірки, і ви його не завантажуєте. Є два види. Бібліотека статичних посилань - це пакет файлів .obj, зібраних в один файл. Посилання вибирає будь-які фрагменти коду з файлу, коли йому потрібно вирішити зовнішній ідентифікатор.

Але що більше стосується бібліотек DLL, файл LIB також може бути бібліотекою імпорту. Тоді це простий невеликий файл, що включає ім’я DLL та список усіх функцій, експортованих DLL. Вам потрібно буде надати його лінкеру під час створення програми, яка використовує DLL, щоб він знав, що зовнішній ідентифікатор насправді є функцією, експортованою DLL. Посилання використовує бібліотеку імпорту для додавання записів до таблиці імпорту для EXE. Що потім, у свою чергу, використовується Windows під час виконання, щоб з’ясувати, які бібліотеки DLL потрібно завантажити для запуску програми.


8

У статичній бібліотеці файл lib містить фактичний об'єктний код для функцій, що надаються бібліотекою. У загальній версії (те, що ви називали статично зв’язаною динамічною бібліотекою), достатньо коду для встановлення динамічного зв’язку під час виконання.

Я не впевнений у "динамічно пов'язаних динамічних бібліотеках" (завантажуються програмно). Ви взагалі посилаєтесь на .lib у такому випадку?

Редагувати:

Трохи пізно, але ні, ви не зв'язуєте .lib. Ну, ви посилаєтесь на бібліотеку з бібліотекою loaderex. Але для фактичної бібліотеки, яку ви використовуєте, ви надаєте свої власні прив'язки за допомогою покажчиків на функцію C, а loadlibrary заповнює їх у.

Ось короткий зміст:

Посилання ǁ Статичні | DLL | LoadLibrary
========= ǁ =============== | | ======================= | | = ==================
Код API ǁ У вашому com- | У DLL | У DLL
життя ǁ складена програма | |
--------- ǁ --------------- | ---------------------- | - ------------------
Функція ǁ Прямий, може | Непрямі через таблицю | Непрямі через ваш
дзвінки ǁ приховувати | заповнюється автоматично | власна функція ptrs
--------- ǁ --------------- | ---------------------- | - ------------------
Обтяження ǁ Укладач | Компілятор / ОС | Ви / ОС

під статично пов'язаними бібліотеками, я маю на увазі використання файлу .lib та зв'язування .dll під час компіляції. Динамічне зв’язування - це зв’язування .dll під час виконання за допомогою функції libraryloaderex () Win32 API.
Сулла

6

Файли lib зчитуються лінкером, а файл dll використовується під час виконання. Файл lib по суті марний під час виконання, а компоновщик не здатний читати файл dll (за винятком, можливо, способу, який тут не має значення).

Різниця між використанням файлів lib для статичного та динамічного зв'язування може заплутати, але якщо ви трохи зрозумієте історію, це стане дуже зрозумілим.

Спочатку існували лише статичні бібліотеки. Для статичної бібліотеки файл .lib містить файли obj. Кожен файл obj є результатом одного і тільки одного вхідного файлу вихідного коду компілятора. Файл lib - це лише сукупність пов'язаних файлів obj, подібно до того, як розмістити файли obj у каталозі. Це по суті те, що таке файл lib, бібліотека файлів obj. Для статичного посилання всі файли obj, які використовує виконуваний файл, об’єднуються в один файл. Порівняйте це з динамічним посиланням, у якому виконуваний файл знаходиться у файлі, окремому від іншого коду, який він використовує.

Для реалізації динамічного зв’язування корпорація Майкрософт модифікувала використання файлів lib таким чином, що вони посилаються на файл dll, а не на розташування у файлі obj. Крім цього, вся інформація, що міститься в бібліотеці для статичного посилання, така ж, як і для динамічного посилання. Всі вони однакові наскільки інформація в них, за винятком того, що файл lib для динамічного посилання визначає файл dll.


1

У dll є "речі", як у exe (можуть бути будь-які дані, імпорт, експорт, читання / запис / виконувані розділи), але різниця полягає в тому, що файл exe експортує лише точку входу (функцію), але експортує dll / багато функцій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.