GNU/Linux >> Tutoriales Linux >  >> Linux

Enlace estático de función de biblioteca compartida en gcc

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.


Linux
  1. Linux:¿monitoreo de todo el sistema de llamadas a una función de biblioteca?

  2. Cómo vincular estáticamente un programa complejo

  3. Cómo inicializar una biblioteca compartida en Linux

  4. Cómo incluir una biblioteca estática en un archivo MAKE

  5. Cómo configurar googleTest como una biblioteca compartida en Linux

¿Convertir una biblioteca estática en una biblioteca compartida?

cargando dinámicamente la biblioteca estática?

¿Cómo hacer el control de versiones de una biblioteca compartida en Linux?

¿Cuál es el significado de Advertencia:vincular la biblioteca compartida con la biblioteca estática no es portátil?

¿Diferencia entre objetos compartidos (.so), bibliotecas estáticas (.a) y DLL (.so)?

¿Cómo puede una biblioteca compartida (.so) llamar a una función que está implementada en su programa de carga?