Compilar una librería dinámica como estática C

Iniciado por mester, 2 Agosto 2016, 15:34 PM

0 Miembros y 1 Visitante están viendo este tema.

mester

Hola.

Me surge el siguiente error cuando ejecuto un programa:  "error while loading shared libraries libmysqlclient.so.18"
Soy consciente del error, me falta la librería MySQL, pero el caso es... lo que quiero hacer es compilar mi programa y hacer que sea portable. Es decir, lo que quiero es poder compilar el programa para usar la libreria estaticamente en el programa. He probado con el parámetro -static-libgcc al compilar con gcc en Linux, pero ni caso.

Espero que me podáis ayudar. Si no entendéis lo que quiero expresar, educadamente preguntadme.

Gracias de antemano.
Justicia es dar a cada uno lo que se merece

ivancea96

Con -static, haces que las librerías de C++ se compilen estáticas.

Si quieres compilar estática una librería externa, tienes que obtenerla para linkeado estático.

Las librerías se suelen compilar de 2 modos:para estático, y para dinámico. Tú debes de tener la dinámica. Localiza la estática, si la tienen.

En caso de que ya la tengas, mira alguna guía de los creadores de esa librería para compilarla en estático.

mester

Cita de: ivancea96 en  2 Agosto 2016, 16:01 PM
Con -static, haces que las librerías de C++ se compilen estáticas.

Si quieres compilar estática una librería externa, tienes que obtenerla para linkeado estático.

Las librerías se suelen compilar de 2 modos:para estático, y para dinámico. Tú debes de tener la dinámica. Localiza la estática, si la tienen.

En caso de que ya la tengas, mira alguna guía de los creadores de esa librería para compilarla en estático.

Si la estática la tiene, pero yo quiero saber si existe alguna manera de compilar la libraria dinamica de manera estatica en un programa. Porque es muy pesado que en cada proyecto tenga que añadir las librerias a cada carpeta y demás.
Justicia es dar a cada uno lo que se merece

ivancea96

Cita de: mester en  2 Agosto 2016, 16:04 PM
Si la estática la tiene, pero yo quiero saber si existe alguna manera de compilar la libraria dinamica de manera estatica en un programa. Porque es muy pesado que en cada proyecto tenga que añadir las librerias a cada carpeta y demás.

No tendría sentido meter una DLL en el ejecutable. Las DLL están hechas para eso, poderlas manejar, re-compilar, modificar; sin tener que re-compilar el ejecutable.

Para compilar en estático, linkea con las librerías estáticas.

Yoel Alejandro

#4
Hola, estoy recién leyendo el tema y no se si lo que voy a decir sea relevante al problema discutido. Pero creo que en GNU si están presentes ambas librerías, la dinámica y la estática, tomará por defecto la dinámica (por la razón que señaló ivance en su último mensaje).

Hay que indicar explícitamente al compilador que tome la estática en lugar de la dinámica. Pero a mí en ocasiones no me ha funcionado, pues insiste en tomar la dinámica. A veces he tenido que borrar temporalmente la librería dinámica para que se vea obligado a tomar la estática. Claro, en realidad no la he borrado, solo renombré la dinámica (para que el compilador no la encuentre), compilé y luego restituí todo como estaba.

P.D.
---------------------
Claro, eso de incluir las bibliotecas estáticas dentro del propio ejecutable es algo ineficiente, pues como dijo ivance, las bibliotecas dinámicas "están hechas para eso, poderlas manejar, re-compilar, modificar; sin tener que re-compilar el ejecutable". Para mí no tendría sentido a menos que fuese una biblioteca que tú mismo has creado con objetivos muy específicos, en cuyo caso sí conviene que, o crees una carpeta "lib" dentro del directorio de tu aplicación la cual contenga todas las bibliotecas, o compiles con las bibliotecas estáticas.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

do-while

¡Buenas!

Da la casualidad de que esta mañana (¿o fue ayer? ni idea) he visto algo relacionado. Supongo que estás usando alguna distro Linux. Al parecer las versiones para enlazar estáticamente se guardan en /usr/lib, y la extensión en lugar de ser .so es .a (solo he leído un comentario y no se dónde, así que si me equivoco corregidme), y a la hora de compilar debes de pasarle a gcc un parámetro que le diga con que librería debe de enlazarse el ejecutable, algo así como: gcc -lunalibrería.a fuente1.c fuente2.c ... -o tuejecutable

Mira a ver si en las páginas del manual o en la página oficial de la librería tienes información concreta sobre como hacer el enlace estático.

Si no es así decídmelo, que me pica la curiosidad pero no tanto como para estar dando vueltas por Google.  :xD
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

Yoel Alejandro

Do-while, es correcto, en Linux la extensión por defecto es "*.a" para bibliotecas estáticas, y "*.so" para dinámicas. En Windows es normalmente "*.dll" para biliotecas dinámicas.

Aquí un excelente tutorial, que fue justamente donde leí por primera vez lo relacionado con el tema http://www.chuidiang.com/clinux/herramientas/librerias.php
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)