¿Convertir una biblioteca estática en una biblioteca compartida?
⏰ 3 minutos de lectura
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?
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
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
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?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
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