Librerías antiguas
[ Sistemas operativos / Linux ]



Uso Red Hat 7.1 y quisiera saber cómo debo compilar los programas para que funcionen en distribuciones más antiguas como Red Hat 6 o Debian 2.2 sin problemas de incompatibilidades con las librerías. ¿Es posible hacerlo de tal modo que sigan funcionando también en cualquier Red Hat 7 estándar? Otra duda que tengo con librerías: al compilar un fichero .tar.gz que incluya librerías con configure, make y make install el sistema sigue sin reconocerlas; parece que no las busca en /usr/local/lib. Si ejecuto como root ldconfig /usr/local/lib se soluciona, pero con el tiempo deja de funcionar y tengo que ejecutarlo de nuevo.
Esteban Alonso



Para compilar programas desde Red Hat 7 que sean compatibles con Red Hat 6, Debian 2.2 y otras distribuciones basadas en glibc 2.1 debes usar las bibliotecas de compatibilidad, así como la versión anterior del compilador. Para ello debes instalar los paquetes compat-libs y compat-egcs como mínimo. Si tu programa está en C++ también deberás instalar compat-libstdc++ y compat-egcs-c++. Si además usas ncurses o es una aplicación X, instala también compat-libs. Hecho esto ya sólo tienes que ejecutar . /usr/i386-glibc21-linux/bin/i386-glibc21-linux-env.sh y podrás compilar normalmente; los ejecutables usarán librerías dinámicas disponibles en distribuciones como Red Hat 6.

La mayoría de los paquetes que compiles de este modo seguirán funcionando en Red Hat 7.1 aunque no tengas las librerías de compatibilidad instaladas, dado que por ejemplo los programas compilados con glibc 2.1 funcionan con glibc 2.2. Para las aplicaciones en C++ hace falta compat-libstdc++, pero no es problema porque se instala por defecto al necesitarlo Netscape. Otra excepción son los programas que usen ncurses, dado que la versión antigua es la 4 y la instalada en las distribuciones actuales es la 5. Este caso sí es más delicado, dado que el paquete no se instala "de serie". Es más, aunque le instalemos nos encontraremos con la sorpresa de que el sistema no busca la librería en el directorio donde se encuentra. Recordemos que, dado que en un sistema hay literalmente cientos de librerías dinámicas, para agilizar la carga de programas el sistema busca las librerías en un fichero caché llamado /etc/ld.so.cache.

También puedes incluir las librerías con el propio paquete en un directorio local. Para utilizarlas hacemos que el programa lanzador sea un guión que haga export LD_LIBRARY_PATH=dir, siendo dir el directorio donde has dejado las librerías antes de invocar el ejecutable. El sistema busca las librerías en los directorios especificados en LD_LIBRARY_PATH antes que en ld.so.cache, para permitir que una aplicación utilice una versión propia de una librería dinámica distinta a la instalada para todo el sistema.

Si tus programas son software libre, puedes considerar distribuirlos mediante un paquete RPM de fuentes. Es una de las formas más simples de distribuir paquetes sin preocuparse de versiones de bibliotecas. Los usuarios de Debian pueden igualmente obtener el .deb mediante alien una vez generado el rpm.

El problema que nos cuentas cuando compilas librerías que se instalan en /usr/local/lib es el mismo que acabamos de comentar con las librerías de compatibilidad, es decir, en Red Hat este directorio no está (sorprendentemente, pues debería estarlo) incluido en /etc/ld.so.conf. Basta con añadirlo al fichero y ejecutar ldconfig. Si no modificas ld.so.conf y en su lugar pasas el directorio como parámetro a ldconfig, a priori el resultado es el mismo: se ha actualizado ld.so.cache con las librerías del directorio. El problema es que cada vez que se instala o desinstala un rpm con una librería el sistema ejecuta de nuevo ldconfig, con lo que se genera de nuevo la caché pero esta vez sin las entradas de /usr/local/lib.

Aprovechamos para comentar que para compilar el kernel con Red Hat 7 también se debe usar el compilador del paquete compat-egcs. No es necesario hacer nada de lo comentado para usar librerías antiguas, sólo asegurarse de utilizar este viejo compilador, que es el recomendado por los autores del kernel. Para ello basta con pasarle el parámetro CC=kgcc a make; por ejemplo: make bzImage CC=kgcc






Anterior         Siguiente         





© 2002 VNU Business Publications España. Queda terminantemente prohibida su reproducción total o parcial por cualquier medio sin el permiso explicito y por escrito del propietario del copyright.