Parece-me estranho usar -Wl,-Bstatic
para saber com gcc
quais bibliotecas quero vincular estaticamente. Afinal, estou dizendo gcc
diretamente 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 gcc
que 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.
fonte
-l:
opção está documentada? Qual versão do gcc eu preciso para usá-lo?ld
linker 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.htmlVocê pode adicionar um arquivo .a no comando de vinculação:
Mas isso não está falando com o driver gcc, mas com o
ld
vinculador 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,-Bstatic
e-Wl,-Bdynamic
. Aqui está uma página de manual do gnu LD: http://linux.die.net/man/1/ldPara vincular seu programa à lib1, lib3 dinamicamente e lib2 estaticamente, use a chamada gcc:
Supondo que a configuração padrão do ld seja usar bibliotecas dinâmicas (no Linux).
fonte
gcc
.gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3
faz o truque.-l
e também-L
são opções de vinculador.gcc yourfiles /path/to/library/libLIBRARY.a
ou-Wl,-Bstatic
?/path/to/library/libLIBRARY.a
precisa 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.