Respostas:
Referir-se:
http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html
Você precisa da versão estática da biblioteca para vinculá-la.
Uma biblioteca compartilhada é realmente um executável em um formato especial com pontos de entrada especificados (e alguns problemas de endereçamento incluídos). Ele não possui todas as informações necessárias para vincular estaticamente.
Você não pode vincular estaticamente uma biblioteca compartilhada (ou vincular dinamicamente uma biblioteca estática).
A bandeira -static
forçará o vinculador a usar bibliotecas estáticas (.a) em vez de compartilhadas (.so). Como as bibliotecas estáticas nem sempre são instaladas por padrão, você pode ter que instalar a biblioteca estática por conta própria.
Outra abordagem possível é usar o statifier ou o Ermine . Ambas as ferramentas tomam como entrada um executável vinculado dinamicamente e como saída criam um executável independente com todas as bibliotecas compartilhadas incorporadas.
Se você deseja vincular, digamos, libapplejuice estaticamente, mas não, digamos, liborangejuice , é possível vincular assim:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Há uma ressalva - se liborangejuice
usar libapplejuice
, entãolibapplejuice
será dinamicamente vinculado.
Você precisará vincular liborangejuice
estaticamente ao lado de libapplejuice
para obter libapplejuice
estática.
E não se esqueça de manter o -Wl,-Bdynamic
resto, você acabará vinculando tudo que estático, inclusive libc
(o que não é uma coisa boa a se fazer).
gcc -o main main.cc -Wl,-rpath=. -Wl,-Bdynamic -lB -Wl,-Bstatic -lA -Wl,-Bdynamic -L.
libB usa libA , está vinculado e ldd
não mostra uma referência a libA . O executável funciona bem. Testado com g ++ 4.7.3.
Se você possui o arquivo .a da sua biblioteca compartilhada (.so), basta incluí-lo com o caminho completo, como se fosse um arquivo de objeto, como este:
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 pode ser um caminho absoluto ou relativo:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Sim, eu sei que essa é uma pergunta de 8 anos, mas me disseram que era possível vincular estaticamente a uma biblioteca de objetos compartilhados e esse foi literalmente o principal sucesso quando procurei mais informações sobre ela.
Para realmente demonstrar que vincular estaticamente uma biblioteca de objetos compartilhados não é possível com o ld
( gcc
vinculador de), em vez de apenas um monte de pessoas insistindo que isso não é possível, use o seguinte gcc
comando:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Claro que você vai ter que compilar objectname.o
a partir de sourcename.c
, e você provavelmente deve fazer a sua própria biblioteca de objeto compartilhado também. Se você fizer isso, o uso-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.
Um pouco tarde, mas ... Encontrei um link que salvei alguns anos atrás e achei que poderia ser útil para vocês:
CDE: Crie automaticamente aplicativos portáteis do Linux
http://www.pgbovine.net/cde.html
Execute a passagem binária como argumento, o nome do binário que você deseja tornar portátil, por exemplo: nmap
./cde_2011-08-15_64bit nmap
O programa lerá todas as bibliotecas vinculadas ao nmap e suas dependências e as salvará em uma pasta chamada cde-package / (no mesmo diretório que você).
Lembre-se, para iniciar o programa portátil, você precisa executar o binário localizado em cde-package / nmap.cde
Cumprimentos
No gcc, isso não é suportado. De fato, isso não é suportado em nenhum compilador / vinculador existente que eu conheça.