Подтвердить что ты не робот

Какая разница между .lib и .a файлами?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Что-то, о чем я не упоминал здесь, является удивительным фактом, что, по крайней мере, некоторые из времени .A файлы и .lib файлы на самом деле являются одним и тем же двоичным форматом. Хотя я не мог найти ничего такого, что говорило об этом на веб-сайте mingw, я заметил, что при попытке подключить 64-разрядный компилятор MS Visual С++ 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), я пробовал.

Ответ 4

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