Я пытаюсь статически компилировать что-то, и я пытаюсь понять, что все эти зависимости. Я знаю, что .dll файлы предназначены для динамически связанных зависимостей, которые потребуются для конечного вывода, но что такое .a и .lib файлы и когда вам это нужно?
Какая разница между .lib и .a файлами?
Ответ 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. Но, конечно, это просто конвенция.