Eu sei que todos os arquivos de compilação (unidades de tradução) são compilados para arquivos de objeto, e então o vinculador resolve símbolos que o compilador não conseguiu encontrar no estágio de compilação, procurando nesses arquivos de objeto. Mas isso também acontece ao vincular a uma biblioteca estática. Então, quais são as diferenças entre vincular a uma biblioteca estática pré-compilada versus vincular a um arquivo de objeto? Eu tenho um arquivo c de aproximadamente 300 mil linhas (sqlite) e estou pensando se devo compilá-lo para uma biblioteca estática em vez de apenas passar o arquivo c para o compilador como uma unidade de compilação. Eu sei que em ambos os casos o compilador não "vê" o código naquele arquivo até o estágio de vinculação. Acho que uma vez, quando eu estava experimentando essas coisas, vi uma diferença no tamanho binário final, mas não consigo lembrar se eu tinha as configurações de otimização definidas corretamente (ou seja, vinculação de nível de função -ffunction-sections -fdata-sections).
Supondo que todo o resto seja igual, não há diferença entre o resultado obtido pela vinculação de um arquivo de objeto independente e o resultado obtido pela vinculação de um arquivo de objeto idêntico extraído de uma biblioteca estática.
Os principais objetivos das bibliotecas estáticas são
Claro, o primeiro também pode ser alcançado simplesmente mantendo os arquivos de objetos construídos por perto. Se estamos falando de algo destinado a ser usado somente em um único projeto, então manter os arquivos de objetos é mais simples, e a reutilização não é uma consideração.
Pode haver vantagens organizacionais em bibliotecas estáticas em certos sistemas de compilação, mas esse é um caso bastante especial, que você reconheceria se fosse relevante para você.