Pregunta

Esta puede ser una pregunta estúpida, pero si compilo una biblioteca compartida usando g++ en una distribución de Linux, y luego muevo esas bibliotecas como archivos objeto a través de una unidad flash a otra computadora con exactamente la misma distribución de Linux y versión de g++, ¿seguiré siendo ¿Puedo vincular esas bibliotecas en mis archivos fuente en la segunda máquina?

Lo pregunto porque no tengo los permisos para instalar las bibliotecas necesarias antes de compilar en la segunda máquina, por lo que sería más fácil para mí compilarlas en mi propia computadora y cargar los archivos objeto compilados mediante una unidad flash a la segunda maquina

¿Fue útil?

Solución

Déjame explicarte con algún ejemplo.

supongamos que tengo un nombre binario myapp en mi maquina X y quiero ejecutarlo en otra máquina Y pero cuando lo ejecuto me muestra algún error como

./myapp: error while loading shared libraries: libcgicc.so.5: cannot open shared object file: No such file or directory

Esto significa que estoy usando una biblioteca que no está en la otra máquina.Por supuesto, podría intentar instalar las mismas bibliotecas en Y que en X.Pero no tengo permiso para hacerlo.Entonces nuestra alternativa es vincular estáticamente bibliotecas con nuestro programa.

En Y, ejecuta el comando ldd myapp.Esto dará algo como:

libpthread.so.0 => /lib/tls/libpthread.so.0 (0xf7f77000)
libdl.so.2 => /lib/libdl.so.2 (0xf7f73000)
libgd.so.2 => /usr/lib/libgd.so.2 (0xf7f26000)
libcgicc.so.5 => not found <------------------------------------//this library missed
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0xf7f08000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0xf7ee4000)

Volvamos a nuestra máquina compiladora, máquina X, y ver qué ldd myapp dice allí para libcgicc:

libcgicc.so.5 => /usr/lib/libcgicc.so.5 (0xb7f18000)

Entonces en la máquina X, la biblioteca que queremos está en /usr/lib.si lo hacemos ls /usr/lib/libcgicc* Podemos ver qué versiones de esta biblioteca están disponibles.En la máquina que es:

/usr/lib/libcgicc.a
/usr/lib/libcgicc.la
/usr/lib/libcgicc.so
/usr/lib/libcgicc.so.5
/usr/lib/libcgicc.so.5.0.1

Entonces hay una versión estática disponible,libcgicc.a.Si no hubiera un .a versión, necesitaríamos obtener una - en debian/ubuntu podríamos rastrearlo haciendo (como superusuario):

apt-file search libcgicc.a

Ahora, todo lo que tenemos que hacer es relink nuestro programa, reemplazando -lcgicc con /usr/lib/libcgicc.a.Ahora cuando lo hacemos ldd myapp En cualquiera de las máquinas, no nos faltan más bibliotecas.

Sin embargo, eso no garantiza que todas las bibliotecas sean exactamente la misma versión.Un problema frecuente es libstdc++ para código C++.Si ve un mensaje como este al intentar ejecutar su código:

./myapp: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9′ not found (required by ./myapp)

Entonces tienes una versión que no coincide.Esto puede solucionarse mediante vinculando estáticamente la biblioteca libstdc++.Comprueba qué versión de g++ estas usando con g++ –version, y luego verifique libstdc++.a en:

/usr/lib/gcc/[platform-name]/[version]

(La ubicación puede ser diferente en su computadora).Una vez que rastree este archivo, podrá vincularlo estáticamente como antes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top