.dll
ou .so
são bibliotecas compartilhadas (vinculadas em tempo de execução), enquanto .a
e .lib
é uma biblioteca estática (vinculada em tempo de compilação). Isso não faz diferença entre Windows e Linux.
A diferença é como eles são tratados. Nota: a diferença está apenas nos costumes, como eles são usados. Não seria muito difícil criar o Linux no modo Windows e vice-versa, exceto que praticamente ninguém faz isso.
Se usarmos uma dll ou chamarmos uma função mesmo de nosso próprio binário, haverá uma maneira simples e clara. Por exemplo, em C, vemos que:
int example(int x) {
...do_something...
}
int ret = example(42);
No entanto, no nível ASM, pode haver muitas diferenças. Por exemplo, em x86, um call
código de operação é executado e o 42
dado na pilha. Ou em alguns registros. Ou em qualquer lugar. Ninguém sabe que antes de escrever a dll , como ela será usada. Ou como os projetos vão querer usá-lo, possivelmente escrito com um compilador (ou em um idioma!) Que nem existe agora (ou é desconhecido para os desenvolvedores da dll).
Por exemplo, por padrão, C e Pascal colocam os argumentos (e obtêm os valores de retorno) da pilha - mas eles estão fazendo isso em ordem diferente . Você também pode trocar argumentos entre suas funções nos registradores por alguma otimização - dependente do compilador -.
Como você vê corretamente, o costume do Windows é criar uma dll, também criamos um mínimo .a
/ .lib
com ela. Essa biblioteca estática mínima é apenas um invólucro, os símbolos (funções) dessa dll são alcançados através dela. Isso faz as conversões de chamada no nível asm necessárias.
Sua vantagem é a compatibilidade. Sua desvantagem é que, se você tiver apenas uma .dll, poderá ter dificuldade em descobrir como é que suas funções serão chamadas. Isso torna o uso de dlls uma tarefa de hacking, se o desenvolvedor da dll não fornecer a você.a
. Assim, ele serve principalmente para fins de fechamento, por exemplo, portanto é mais fácil obter dinheiro extra para os SDKs.
Outra desvantagem é que, mesmo que você use uma biblioteca dinâmica, é necessário compilar esse pequeno invólucro estaticamente.
No Linux, a interface binária das DLLs é padrão e segue a convenção C. Portanto, não .a
é necessário e há compatibilidade binária entre as bibliotecas compartilhadas; em troca, não temos as vantagens do costume da microsoft.