2010-07-14 2 views
58

Что находится внутри .lib-файла Static-библиотеки, статически связанной динамической библиотеки и динамически связанной динамической библиотеки?Что находится внутри .lib-файла библиотеки Static, статически связанной динамической библиотеки и динамически связанной динамической библиотеки?

Почему нет необходимости в файле .lib в динамически связанной динамической библиотеке, а также в статической привязке. .lib-файл - это ничего, кроме файла .obj со всеми методами. Это верно?

+2

Можно отметить, что речь идет о платформе MS Windows. – cubuspl42

ответ

89

Для статической библиотеки файл .lib содержит весь код и данные для библиотеки. Затем компоновщик идентифицирует нужные ему биты и помещает их в окончательный исполняемый файл.

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

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

+1

После долгого поиска, IMO, я получил лучший ответ по причине использования lib & dll. благодаря – Jeet

6

В статической библиотеке файл lib содержит фактический объектный код для функций, предоставляемых библиотекой. В общей версии (то, что вы называете статически связанной динамической библиотекой) достаточно всего кода для установления динамической привязки во время выполнения.

Я не уверен насчет «динамически связанных динамических библиотек» (загружен программно). Вы даже связываетесь с .lib в этом случае?

Edit:

Немного с опозданием, но нет, вы не связать .lib. Ну, вы ссылаетесь на lib с библиотекойloaderex. Но для реальной библиотеки вы используете, вы предоставляете свои собственные привязок с помощью функции 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 
+0

статически связанными библиотеками, я имею в виду использование .lib-файла и связывание DLL во время компиляции. Динамическое связывание связывает DLL во время выполнения с помощью функции libraryloaderex() Win32 API. – Sulla

1

В DLL файлы являются «вещи», как в ехе (могут быть любые данные, импорт, экспорт, чтение/запись/исполняемые разделы), но разница в том, что exe-файл экспортирует только точку входа (функция), но dll экспортирует одну или несколько функций.

8

Я нашел следующее answer от Ганса также полезное здесь. Оно очищает воздух, что могут быть два типа файлов lib.

Файл LIB используется для создания вашей программы, он существует только на вашей машине , и вы не отправляете ее. Есть два вида. Статическая ссылка библиотека представляет собой мешок файлов .obj, собранных в один файл. Компонент выбирает любые фрагменты кода из файла, когда ему необходимо разрешить внешний идентификатор.

Но, что более актуально для библиотек DLL, файл LIB также может быть библиотекой импорта. Это простой небольшой файл, который включает в себя имя DLL и список всех функций, экспортируемых DLL, . Вам нужно будет предоставить его компоновщику при создании программы, использующей DLL, так что знает, что внешний идентификатор фактически является функцией, экспортируемой DLL. Линкер использует библиотеку импорта для добавления записей в таблицу импорта для EXE. Затем, в свою очередь, Windows использует , чтобы выяснить, какие DLL необходимо загрузить для запуска программы.

1

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

Различия между использованием файлов lib для статической и динамической компоновки могут быть запутывающими, но если вы понимаете небольшую историю, тогда становится очень ясно.

Первоначально были только статические библиотеки. Для статической библиотеки файл .lib содержит файлы obj. Каждый файл obj - это выход одного и только одного входного файла исходного кода компилятора. Файл lib - это всего лишь коллекция связанных файлов obj, так же как и размещение obj-файлов в каталоге. По сути, это файл lib, это библиотека файлов obj. Для статической ссылки все файлы obj, которые использует исполняемый файл, объединены в один файл. Сравните это с динамической ссылкой, в которой исполняемый файл находится в файле отдельно от другого используемого им кода.

Чтобы реализовать динамическое связывание, Microsoft изменила использование файлов lib таким образом, что они ссылаются на файл dll, а не на места в файле obj. Кроме того, вся информация, которая находится в библиотеке для статической ссылки, такая же, как для динамической ссылки. Это все равно, что и информация в них, за исключением того, что файл lib для динамической ссылки указывает файл dll.

Смежные вопросы