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

3 minutos de lectura

avatar de usuario
eli cortesano

Tengo una biblioteca de terceros que consiste principalmente en una gran cantidad de estáticos (.a) archivos de biblioteca. Puedo compilar esto en un solo .a archivo de biblioteca, pero realmente necesito que sea un solo .so archivo de biblioteca compartida.

¿Hay alguna forma de convertir una estática .a archivo en un archivo compartido .so ¿expediente? O, de manera más general, ¿existe una buena manera de combinar una gran cantidad de estáticos? .a archivos con algunos .o archivos de objetos en un solo .so ¿expediente?

avatar de usuario
dice

Hace esto (con las -L apropiadas, por supuesto)

gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib

¿No hacerlo?

  • Usar gcc -shared funcionó, pero solo después de volver a compilar con -fPIC. ¡Gracias por señalarme en la dirección correcta!

    – Eli Cortesano

    17 de marzo de 2009 a las 17:30

  • Sé que esta es una respuesta antigua, pero… ¿no funciona? Con cada biblioteca estática que he probado, el objeto compartido resultante ya no exporta ninguno de los símbolos originales.

    – Pedro

    12 de agosto de 2020 a las 12:09

  • Encontré el mismo problema @Peter

    – André Cruz

    29 de julio de 2021 a las 13:18


No puede hacer esto si los objetos dentro de la biblioteca estática se compilaron sin -fPIC o similar.

  • En objetivos bien apoyados, PIC no es esencial para el código de biblioteca compartida. Simplemente da como resultado un uso mucho más eficiente de la memoria (la mayoría, en lugar de una minoría, de las páginas se pueden compartir) a expensas de algo de rendimiento.

    – R.. GitHub DEJA DE AYUDAR A ICE

    4 oct 2010 a las 16:42

  • La falta de -fPIC o similar en algunas condiciones da como resultado SegFault

    – vitaly.vch

    1 de noviembre de 2010 a las 9:33

avatar de usuario
Tranquilo

g++ -shared -o megalib.so foo.o bar.o -Wl,--whole-archive -la_static_lib -lb_static_lib -Wl,--no-whole-archive -lc_static_lib -lother_shared_object

No estoy seguro acerca de gcc, pero para g++ tuve que agregar la opción –whole-archive linker para incluir los objetos de las bibliotecas estáticas en el objeto compartido. La opción –no-whole-archive es necesaria si desea vincular a libc_static_lib.a y libother_shared_object.so, pero no incluirlos como un todo en megalib.so.

  • -Wl--no-whole-archive es necesario al final de la línea de comando. Vea la edición de la pregunta, aquí.

    – de avre

    07/08/2012 a las 20:52

avatar de usuario
Anastasio Andronidis

ar -x también puede ser útil si desea centrarse en objetos específicos de su .as y no desea agregar nada por su cuenta.

Ejemplos:

ar -x lib***.a
gcc -shared *.o -o lib***.so

ar -x lib***.a
gcc -shared *.o -o lib***.so

  • ¿No se tomó esto de otra respuesta anterior y se publicó con menos contexto/explicación?

    – Dan

    11 de septiembre de 2019 a las 17:34

  • No, no había tal respuesta en ese momento. Ver historia.

    – Artur Shaikhullin

    13 de septiembre de 2019 a las 0:19

  • Podría haber jurado en el navegador web que mostraba que la fecha del otro era anterior, pero en la aplicación del teléfono muestra que este fue el primero. ¡Mis disculpas!

    – Dan

    13 de septiembre de 2019 a las 9:06

  • ¿No se tomó esto de otra respuesta anterior y se publicó con menos contexto/explicación?

    – Dan

    11 de septiembre de 2019 a las 17:34

  • No, no había tal respuesta en ese momento. Ver historia.

    – Artur Shaikhullin

    13 de septiembre de 2019 a las 0:19

  • Podría haber jurado en el navegador web que mostraba que la fecha del otro era anterior, pero en la aplicación del teléfono muestra que este fue el primero. ¡Mis disculpas!

    – Dan

    13 de septiembre de 2019 a las 9:06

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad