Dizendo ao gcc diretamente para vincular uma biblioteca estaticamente


133

Parece-me estranho usar -Wl,-Bstaticpara saber com gccquais bibliotecas quero vincular estaticamente. Afinal, estou dizendo gccdiretamente todas as outras informações sobre como vincular às bibliotecas ( -Ldir, -llibname).

É possível informar diretamente ao driver gcc quais bibliotecas devem ser vinculadas estaticamente?

Esclarecimento: Eu sei que se uma determinada biblioteca existir apenas em versões estáticas, ela será usada sem ela -Wl,-Bstatic, mas quero sugerir gccque prefira a biblioteca estática. Sei também que especificar o arquivo da biblioteca diretamente vincularia a ele, mas prefiro manter a semântica para incluir as bibliotecas estáticas e dinâmicas da mesma forma.

Respostas:


189

É possível, é claro, use em -l:vez de -l. Por exemplo, -l:libXYZ.apara vincular com libXYZ.a. Observe o libescrito, ao contrário do -lXYZque seria expandido automaticamente para libXYZ.


63
Deus, se apenas o Gnu tivesse feito disso o padrão em primeiro lugar, em vez da loucura do prefixo da lib. Oh, o tempo e a frustração que teríamos economizado.
Timmmm

9
Radek, essa -l:opção está documentada? Qual versão do gcc eu preciso para usá-lo?
Osgx

18
Na verdade, é uma opção do ldlinker sourceware.org/binutils/docs/ld/Options.html " -l namespec.. Se o namespec estiver no formato: filename, o ld pesquisará o caminho da biblioteca em busca de um arquivo chamado filename, caso contrário, ele pesquisará na biblioteca caminho para um arquivo chamado libnamespec.a .. nos sistemas ELF .., o ld procurará em um diretório uma biblioteca chamada libnamespec.so antes de procurar por um chamado libnamespec.a .. Observe que esse comportamento não se aplica a: filename , que sempre especifica um arquivo chamado filename. ". Desde binutils 2,18 - sourceware.org/binutils/docs-2.18/ld/Options.html
osgx

17
O GNU não é responsável por essa interface, ele foi herdado da cadeia de ferramentas Unix.
akim

É uma pena que isso não funcione em vinculadores não-GNU. É uma boa maneira de "forçar" o LDLIBS e opções de configuração semelhantes para encontrar bibliotecas estáticas sem soluções estranhas de sinalizadores de links.
Nneonneo 22/03

130

Você pode adicionar um arquivo .a no comando de vinculação:

  gcc yourfiles /path/to/library/libLIBRARY.a

Mas isso não está falando com o driver gcc, mas com o ldvinculador como opções -Wl,anything.

Quando você diz ao gcc ou ao ld -Ldir -lLIBRARY, o vinculador verifica as versões estática e dinâmica da biblioteca (você pode ver um processo com -Wl,--verbose). Para alterar a ordem dos tipos de biblioteca marcados, você pode usar -Wl,-Bstatice -Wl,-Bdynamic. Aqui está uma página de manual do gnu LD: http://linux.die.net/man/1/ld

Para vincular seu programa à lib1, lib3 dinamicamente e lib2 estaticamente, use a chamada gcc:

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3

Supondo que a configuração padrão do ld seja usar bibliotecas dinâmicas (no Linux).


3
Versão curta: Não há como fazer isso com o atual gcc.
Elazar Leibovich

7
Elazar Leibovich, mas gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3faz o truque.
Osgx

13
A vinculação (e a pesquisa de bibliotecas dyn / estáticas) é feita pelo vinculador. Portanto, você deve usar as opções do vinculador. -le também -Lsão opções de vinculador.
Osgx

3
Esta resposta foi votada por causa de gcc yourfiles /path/to/library/libLIBRARY.aou -Wl,-Bstatic?
Tor Klingberg

7
@TorKlingberg, a Variante 1 /path/to/library/libLIBRARY.aprecisa de um caminho completo para ser escrita, a variante 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamicé apenas longa e adiciona 2 opções extras e assume o modo padrão como Bdynamic, e a variante aceita 3 -l:libXYZ.aé curta e funciona. Todos os três funcionarão para muitos casos, e a variante 2 pode não funcionar ao vincular programas estáticos. A etapa de vinculação real da lib é a mesma em todas as variantes que eu entendo.
osgx 24/05
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.