Я пытаюсь статически скомпилировать что-то, и я пытаюсь разобраться, каковы все эти зависимости. Я знаю, что .dll файлы для динамично связанных зависимостей, которые будут требоваться окончательным результатом, но что такое.a и .lib файлы и когда Вам нужен каждый из тех?
.a - это архив кода: скомпилированный, но не связанный. Вы свяжетесь с ним статически на последнем этапе связывания вашей программы.
.lib может быть либо тем же, что и .a, либо волшебной так называемой «библиотекой импорта»: тонким заполнителем, который заставляет вас требовать .dll во время выполнения.
Обычно .a предназначен для статических библиотек под Linux, тогда как .lib - для того же, но в Windows. Но, конечно, это просто условность.
В системах Unix у вас есть файлы .a
. Это простые архивы объектных файлов ( .o
).
В Windows есть файлы .lib
, которые представляют собой одно и то же, но для Windows, а не для Unix.
Дополнительная тонкость заключается в том, что для того, чтобы связать некоторый код с DLL (в Windows), вы должны установить ссылку на файл .lib
, который содержит простые оболочки, вызывающие DLL. В системе Unix обычно нет необходимости в таких оболочках (компоновщик достаточно умен, чтобы генерировать их на лету).