Estive envolvido em algum debate sobre bibliotecas no Linux e gostaria de confirmar algumas coisas.
Entendo (por favor, corrija-me se estiver errado e editarei minha postagem mais tarde), existem duas maneiras de usar bibliotecas ao criar um aplicativo:
- Bibliotecas estáticas (arquivos .a): no momento do link, uma cópia de toda a biblioteca é colocada no aplicativo final para que as funções na biblioteca estejam sempre disponíveis para o aplicativo de chamada.
- Objetos compartilhados (arquivos .so): no momento do link, o objeto é apenas verificado em relação à sua API por meio do arquivo de cabeçalho correspondente (.h). A biblioteca não é realmente usada até o tempo de execução, onde é necessária.
A vantagem óbvia das bibliotecas estáticas é que elas permitem que o aplicativo inteiro seja independente, enquanto o benefício das bibliotecas dinâmicas é que o arquivo ".so" pode ser substituído (ou seja: caso precise ser atualizado devido a uma segurança) bug) sem exigir que o aplicativo base seja recompilado.
Ouvi algumas pessoas fazerem uma distinção entre objetos compartilhados e bibliotecas vinculadas dinâmicas (DLLs), mesmo que sejam arquivos ".so". Existe alguma distinção entre objetos compartilhados e DLLs quando se trata de desenvolvimento de C / C ++ no Linux ou em qualquer outro sistema operacional compatível com POSIX (por exemplo: MINIX, UNIX, QNX, etc)? Disseram-me que uma diferença importante (até agora) é que os objetos compartilhados são usados apenas em tempo de execução, enquanto os DLLs devem ser abertos primeiro usando a chamada dlopen () no aplicativo.
Por fim, também ouvi alguns desenvolvedores mencionarem "arquivos compartilhados", que, a meu ver, também são bibliotecas estáticas, mas nunca são usados diretamente por um aplicativo. Em vez disso, outras bibliotecas estáticas serão vinculadas aos "arquivos compartilhados" para extrair algumas (mas não todas) funções / recursos do arquivo compartilhado para a biblioteca estática que está sendo construída.
Agradecemos desde já a sua ajuda.
Atualizar
No contexto em que esses termos foram fornecidos a mim, eram termos efetivamente errôneos usados por uma equipe de desenvolvedores do Windows que precisavam aprender Linux. Tentei corrigi-los, mas as normas de linguagem (incorretas) ficaram presas.
- Objeto compartilhado: uma biblioteca que é automaticamente vinculada a um programa quando o programa é iniciado e existe como um arquivo independente. A biblioteca é incluída na lista de links em tempo de compilação (ou seja:
LDOPTS+=-lmylib
para um arquivo de biblioteca chamadomylib.so
). A biblioteca deve estar presente no momento da compilação e quando o aplicativo é iniciado. - Biblioteca estática: uma biblioteca que é mesclada no próprio programa real no momento da construção para um único aplicativo (maior) que contém o código do aplicativo e o código da biblioteca que é automaticamente vinculado a um programa quando o programa é criado e o binário final que contém ambos o programa principal e a própria biblioteca existem como um único arquivo binário independente. A biblioteca é incluída na lista de links em tempo de compilação (ou seja:
LDOPTS+=-lmylib
para um arquivo de biblioteca chamado mylib.a). A biblioteca deve estar presente no momento da compilação. - DLL: Essencialmente o mesmo que um objeto compartilhado, mas em vez de ser incluída na lista de vinculação no momento da compilação, a biblioteca é carregada via
dlopen()
/dlsym()
comandos para que a biblioteca não precise estar presente no tempo de compilação para a compilação do programa. Além disso, a biblioteca não precisa estar presente (necessariamente) na inicialização do aplicativo ou no tempo de compilação , pois é necessária apenas no momento em que as chamadasdlopen
/dlsym
são feitas. - Arquivo compartilhado: essencialmente o mesmo que uma biblioteca estática, mas é compilado com os sinalizadores "export-shared" e "-fPIC". A biblioteca é incluída na lista de links em tempo de compilação (ou seja:
LDOPTS+=-lmylibS
para um arquivo de biblioteca chamadomylibS.a
). A distinção entre os dois é que esse sinalizador adicional é necessário se um objeto compartilhado ou DLL desejar vincular estaticamente o archive compartilhado em seu próprio código E poder disponibilizar as funções no objeto compartilhado para outros programas, em vez de apenas usá-los interno para a DLL. Isso é útil no caso em que alguém fornece uma biblioteca estática e você deseja reembalá-la como uma SO. A biblioteca deve estar presente no momento da compilação.
Atualização Adicional
A distinção entre " DLL
" e " shared library
" foi apenas um coloquialismo (preguiçoso, impreciso) na empresa em que trabalhei na época (os desenvolvedores do Windows foram forçados a mudar para o desenvolvimento do Linux e o termo travado), seguindo as descrições mencionadas acima.
Além disso, o S
literal " " à direita após o nome da biblioteca, no caso de "arquivos compartilhados", era apenas uma convenção usada nessa empresa e não no setor em geral.
.a
arquivos, o "a" na verdade significa "archove" e é simplesmente um arquivo de arquivos de objetos. Os vinculadores modernos devem ser bons o suficiente para não precisar incluir a biblioteca while, apenas os arquivos de objetos no archive necessário e podem até usar as seções de código / dados nos arquivos de objetos que são referenciados.