.dll
или .so
являются общими библиотеками (связаны во время выполнения), а .a
и .lib
являются статической библиотекой (связаны во время компиляции). В этом нет разницы между Windows и Linux.
Разница в том, как они обрабатываются. Примечание: разница только в таможне, как они используются. Было бы не сложно создать Linux на Windows и наоборот, за исключением того, что практически никто этого не делает.
Если мы используем dll или вызываем функцию даже из нашего собственного двоичного файла, существует простой и понятный способ. Например, в C мы видим, что:
int example(int x) {
...do_something...
}
int ret = example(42);
Однако на уровне asm может быть много различий. Например, на x86, call
код операции выполняется, а 42
в стеке. Или в некоторых регистрах. Или где угодно. Никто не знает что до написания dll , как он будет использоваться. Или как проекты захотят использовать это, возможно, написанное с помощью компилятора (или на языке!), Которого сейчас даже не существует (или это неизвестно разработчикам библиотеки dll).
Например, по умолчанию C и Pascal помещают аргументы (и получают возвращаемые значения) из стека - но они делают это в другом порядке . Вы также можете обмениваться аргументами между вашими функциями в регистрах путем некоторой - зависимой от компилятора - оптимизации.
Как вы видите правильно, Windows обычай состоит в том, что мы создаем dll, мы также создаем минимальный .a
/ .lib
с ним. Эта минимальная статическая библиотека является только оберткой, символы (функции) этой библиотеки доступны через нее. Это делает необходимые преобразования вызовов уровня asm.
Его преимуществом является совместимость. Его недостатком является то, что если у вас есть только .dll, вам может быть трудно понять, как его функции нужно вызывать. Это делает использование dll.a
хакерской задачей, если разработчик dll не дает вам . Таким образом, он служит, главным образом, в целях закрытости, например, так что легче получить дополнительные деньги для SDK.
Другой его недостаток заключается в том, что даже если вы используете динамическую библиотеку, вам нужно статически скомпилировать эту небольшую оболочку.
В Linux бинарный интерфейс dll является стандартным и соответствует соглашению C. Таким образом, нет .a
необходимости, и существует совместимость двоичных файлов между общими библиотеками, в обмен на что мы не имеем преимуществ обычая Microsoft.