В чем разница между файлами.lib и.a?

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

4 ответа

Решение

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

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

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

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

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

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

Что-то, что я пока не упомянул здесь, это удивительный факт, что, по крайней мере, иногда файлы.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), которые я пробовал.

Другие вопросы по тегам