Consulte:
http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/
Necesita la versión estática de la biblioteca para vincularla.
Una biblioteca compartida es en realidad un ejecutable en un formato especial con puntos de entrada especificados (y algunos problemas de direccionamiento fijo incluidos). No tiene toda la información necesaria para enlazar estáticamente.
No puede vincular estáticamente una biblioteca compartida (o vincular dinámicamente una estática).
La bandera -static
forzará al enlazador a usar bibliotecas estáticas (.a) en lugar de compartidas (.so). Pero las bibliotecas estáticas no siempre se instalan de forma predeterminada, por lo que es posible que deba instalar la biblioteca estática usted mismo.
Otro enfoque posible es usar estatificador o armiño. Ambas herramientas toman como entrada un ejecutable enlazado dinámicamente y como salida crean un ejecutable independiente con todas las bibliotecas compartidas incrustadas.
Si tiene el archivo .a de su biblioteca compartida (.so), simplemente puede incluirlo con su ruta completa como si fuera un archivo de objeto, así:
Esto genera main.o simplemente compilando:
gcc -c main.c
Esto vincula ese archivo de objeto con la biblioteca estática correspondiente y crea el ejecutable (llamado "principal"):
gcc main.o mylibrary.a -o main
O en un solo comando:
gcc main.c mylibrary.a -o main
También podría ser una ruta absoluta o relativa:
gcc main.c /usr/local/mylibs/mylibrary.a -o main
Si desea vincular, diga, libapplejuice estáticamente, pero no, digamos, liborangejuice , puede enlazar así:
gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary
Hay una advertencia:si liborangejuice
usa libapplejuice
, luego libapplejuice
se vinculará dinámicamente también.
Tendrás que vincular liborangejuice
estáticamente junto con libapplejuice
para obtener libapplejuice
estática.
Y no olvides mantener -Wl,-Bdynamic
de lo contrario, terminará vinculando todo lo estático, incluido libc
(lo cual no es algo bueno de hacer).
Sí, sé que esta es una pregunta de hace 8 años, pero me dijeron que era posible establecer un vínculo estático con una biblioteca de objetos compartidos y este fue, literalmente, el primer resultado cuando busqué más información al respecto.
Para demostrar realmente que vincular estáticamente una biblioteca de objetos compartidos no es posible con ld
(gcc
's linker), a diferencia de un grupo de personas que insisten en que no es posible, use el siguiente gcc
comando:
gcc -o executablename objectname.o -Wl,-Bstatic -l:libnamespec.so
(Por supuesto, tendrás que compilar objectname.o
de sourcename.c
, y probablemente también debería crear su propia biblioteca de objetos compartidos. Si lo hace, use -Wl,--library-path,.
para que ld pueda encontrar su biblioteca en el directorio local).
El error real que recibe es:
/usr/bin/ld: attempted static link of dynamic object `libnamespec.so'
collect2: error: ld returned 1 exit status
Espero que ayude.