В чем разница между .lib и .a файлами? - PullRequest
39 голосов
/ 26 февраля 2010

Я пытаюсь что-то статически скомпилировать и пытаюсь понять, что это за зависимости. Я знаю, что файлы .dll предназначены для динамически связанных зависимостей, которые потребуются для окончательного вывода, но что такое файлы .a и .lib и когда вам нужен каждый из них?

Ответы [ 4 ]

39 голосов
/ 26 февраля 2010

.a - архив кода: скомпилированный, но не связанный. Вы будете статически связываться с ним во время последнего шага ссылки вашей программы.

.lib может быть тем же, что и .a, или волшебной так называемой «библиотекой импорта»: тонкий заполнитель, который заставляет вас требовать .dll во время выполнения.

22 голосов
/ 26 февраля 2010

В системах Unix у вас есть файлы .a. Это простые архивы объектных файлов (.o).

В Windows есть .lib файлы, которые представляют собой одно и то же, но для Windows вместо Unix.

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

6 голосов
/ 13 июня 2014

Что-то, о чем я пока не упомянул, - это удивительный факт, что, по крайней мере, в некоторых случаях .a-файлы и .lib-файлы на самом деле имеют одинаковый двоичный формат . Хотя я не смог найти ничего такого, что говорило бы на веб-сайте mingw, я заметил, что при попытке заставить 64-битный компилятор MS Visual C ++ cl.exe связать файл .dll, созданный с помощью компилятора mingw-w64 g ++, он, к счастью, принял командную строку

cl /EHsc /Ipath\to\include gmp_test.cpp path\to\lib\libgmp.dll.a

и полученный файл .exe работает правильно, как только я помещаю копию соответствующего файла .dll в текущий каталог. (Было пробормотано предупреждение «Предупреждение командной строки D9024: нераспознанный тип исходного файла 'путь \ к \ lib \ gmp-6.0.0 \ lib \ libgmp.dll.a', предполагается, что объектный файл".)

Еще одним свидетельством является то, что команда Linux file сообщила о «текущем архиве архива» для нескольких файлов каждого расширения (.lib или .a), которые я пробовал.

5 голосов
/ 26 февраля 2010

Обычно .a - для статических библиотек в Linux, тогда как .lib - для тех же, но в Windows. Но, конечно, это просто соглашение.

...