linux - compartilhadas - Link estático da função de biblioteca compartilhada no gcc



comando bibliotecas (4)

Como posso vincular uma função de biblioteca compartilhada estaticamente no gcc?

https://ffff65535.com


No gcc, isso não é suportado. Na verdade, isso não é suportado em nenhum compilador / linker existente que conheço.


Referir-se:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

Você precisa da versão estática da biblioteca para vincular.

Uma biblioteca compartilhada é, na verdade, um executável em um formato especial com pontos de entrada especificados (e alguns problemas de endereçamento estão incluídos). Não possui todas as informações necessárias para vincular estaticamente.

Você não pode vincular estaticamente biblioteca compartilhada (ou dinamicamente link estático)

Flag -static forçará o vinculador a usar biblioteca estática (.a) em vez de compartilhada (.so) Mas. Bibliotecas estáticas nem sempre instaladas por padrão. Portanto, se você precisar de link estático, precisará instalar bibliotecas estáticas.

Outra abordagem possível é usar o statifier ou o Ermine . Ambas as ferramentas tomam como entrada executáveis ​​dinamicamente vinculados e como saída criam executáveis ​​independentes com todas as bibliotecas compartilhadas incorporadas.


Se você tiver o arquivo .a da sua biblioteca compartilhada (.so), pode simplesmente incluí-lo com seu caminho completo como se fosse um arquivo de objeto, assim:

Isso gera main.o apenas compilando:

gcc -c main.c

Isso vincula esse arquivo de objeto à biblioteca estática correspondente e cria o executável (chamado "main"):

gcc main.o mylibrary.a -o main

Ou em um único comando:

gcc main.c mylibrary.a -o main

Também poderia ser um caminho absoluto ou relativo:

gcc main.c /usr/local/mylibs/mylibrary.a -o main

Sim, eu sei que esta é uma pergunta de 8 anos de idade, mas me disseram que era possível vincular estaticamente contra uma biblioteca de objetos compartilhados e isso era literalmente o maior sucesso quando eu procurava por mais informações sobre isso.

Para realmente demonstrar que vincular estaticamente uma biblioteca de objeto compartilhado não é possível com ld (linker do gcc ) - ao contrário de um monte de pessoas insistindo que não é possível - use o seguinte comando gcc :

gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so

(Claro que você terá que compilar objectname.o de sourcename.c , e você provavelmente também deve criar sua própria biblioteca de objetos compartilhados. Se fizer isso, use -Wl,--library-path,. para que ld pode encontrar sua biblioteca no diretório local.)

O erro real que você recebe é:

/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status

Espero que ajude.





gcc