3.6. Usando tanto bibliotecas estáticas como dinâmicas com GCC


Algumas vezes é necessário ligar algumas bibliotecas de forma estática e outras dinamicamente. Esta situação traz alguns desafios.

Introdução

gcc reconhece tanto as bibliotecas dinâmicas quanto as estáticas. Quando a -lfoo se encontrar a opção gcc primeiro tentará localizar um objeto compartilhado (um arquivo .so ) contendo uma versão dinamicamente ligada da biblioteca foo, e depois procurará o arquivo (.a) contendo uma versão estática da biblioteca. Assim, as seguintes situações podem resultar desta busca:

  • Somente o objeto compartilhado é encontrado, e gcc se conecta dinamicamente com ele.
  • Somente o arquivo é encontrado, e gcc links contra ele de forma estática.
  • Tanto o objeto compartilhado quanto o arquivo são encontrados e, por padrão, gcc seleciona a ligação dinâmica contra o objeto compartilhado.
  • Não é encontrado objeto compartilhado nem arquivo, e a ligação falha.

Devido a estas regras, a melhor maneira de selecionar a versão estática ou dinâmica de uma biblioteca para ligação é ter apenas essa versão encontrada por gcc. Isto pode ser controlado até certo ponto usando ou deixando de fora diretórios contendo as versões da biblioteca, ao especificar a -Lpath opções.

Além disso, como a ligação dinâmica é o padrão, a única situação em que a ligação deve ser explicitamente especificada é quando uma biblioteca com ambas as versões presentes deve ser ligada estaticamente. Há duas resoluções possíveis:

  • Especificando as bibliotecas estáticas por caminho de arquivo em vez da opção -l
  • Usando a opção -Wl para passar opções para o linker

Especificando as bibliotecas estáticas por arquivo

Normalmente, gcc é instruído a criar um link contra a biblioteca foo com o -lfoo opção. Entretanto, é possível especificar o caminho completo para arquivar libfoo.a contendo, ao invés disso, a biblioteca:

$ gcc ... caminho/para/libfoo.a ...
Copy to Clipboard Toggle word wrap

A partir da extensão do arquivo .a, gcc entenderá que se trata de uma biblioteca para se conectar com o programa. No entanto, especificar o caminho completo para o arquivo da biblioteca é um método menos flexível.

Usando a opção -Wl

A opção gcc -Wl é uma opção especial para passar opções para o linker subjacente. A sintaxe desta opção difere das outras opções gcc. A opção -Wl é seguida por uma lista separada por vírgula de opções de linker, enquanto outras opções gcc requerem uma lista de opções separada por espaço.

O linker ld usado por gcc oferece as opções -Bstatic e -Bdynamic para especificar se as bibliotecas que seguem esta opção devem ser vinculadas de forma estática ou dinâmica, respectivamente. Após passar -Bstatic e uma biblioteca para o linker, o comportamento padrão de linkamento dinâmico deve ser restaurado manualmente para que as seguintes bibliotecas sejam vinculadas dinamicamente com a opção -Bdynamic.

Para vincular um programa, ligue a biblioteca first estaticamente (libfirst.a) e second dinamicamente (libsecond.so):

$ gcc ... -Wl,-Bstatic -lfirst -Wl,-Bdynamic -lsecond...
Copy to Clipboard Toggle word wrap
Nota

gcc pode ser configurado para usar links que não o padrão ld.

Recursos adicionais

  • Usando a Coleção de Compiladores GNU (GCC)
  • Documentação para binúteis 2.27
Voltar ao topo
Red Hat logoGithubredditYoutubeTwitter

Aprender

Experimente, compre e venda

Comunidades

Sobre a documentação da Red Hat

Ajudamos os usuários da Red Hat a inovar e atingir seus objetivos com nossos produtos e serviços com conteúdo em que podem confiar. Explore nossas atualizações recentes.

Tornando o open source mais inclusivo

A Red Hat está comprometida em substituir a linguagem problemática em nosso código, documentação e propriedades da web. Para mais detalhes veja o Blog da Red Hat.

Sobre a Red Hat

Fornecemos soluções robustas que facilitam o trabalho das empresas em plataformas e ambientes, desde o data center principal até a borda da rede.

Theme

© 2025 Red Hat