Tips para compilar

By zeratulmdq

Bueno, acá tenemos esta pequeña explicación de como compilar un programa/librería escrita por broli, un usuario amigo de BTArg. Espero les sea útil.

El otro día, compilando un programa, me di cuenta que, de forma mecánica, hago una serie de pasos para resolver (o evitar) problemas comunes, que muchas veces no comento a la persona que me pregunta como compilar. Por eso ahora voy a listar esos “conocimientos” para que les sea mas fácil
(voy a tratar de hacer esto lo mas abstracto con respecto a la distro)

conceptos básicos
código fuente: archivos de texto plano, con las ordenes para la pc, en algún lenguaje
compilar: convertir el código fuente, en un archivo binario (0 y 1) para que la Pc pueda entenderlo
MAKEFILE: es un archivo con las ordenes para compilar. (mas adelante explico mas)

cuando uno crea un programa, muchas veces usa código de otra persona (para no tener que reinventar la rueda). Luego, para compilar se necesita TODO el código (el propio y el desarrollado por otro)
Entonces nuestro código DEPENDE del código del otro.
En otros sistemas operativos, cuando uno hace un programa debe empaquetar una copia de todo lo que usa, haciendo los binarios y las instalaciones mucho mas pesadas (y auto suficientes), pero duplicando utilidades y código
Esta forma de desarrollo tiene muchas ventajas que no vienen al caso.
Un error común es el de pensar que los paquetes “dev” son solo para los que quieren hacer programas. estos son NECESARIOS para compilar.
Otro error común es la creencia de que si quiero instalar un paquete automagico (rpm, deb u otro) y tiene dependencias no cumplidas, estas solo pueden ser resueltas por otro paquete automagico.
siguiendo un par de pautas (que explicare mas tarde) se puede instalar satisfactoriamente una mezcla de paquetes y código.

¿como sabe el sistema donde buscar?
Si es una librería de lo que estamos hablando, se hace de dos maneras.
una es usando ldconfig. lo que hace este programa es revisar un conjunto de directorios, y hacer una lista de las librerías que encuentra. los directorios que revisa, están en el archivo /etc/ld.so.conf , por lo que ustedes pueden agregar cualquiera que quieran/necesiten. No olviden que después de modificar el archivo de configuración, tienen que reconstruir la lista usando el comando “ldconfig”
la otra forma es usando pkg-config. este es un poco mas complicado. este, para crear la lista de librerías instaladas, usa una serie de archivitos *.pc (que trae cada librería) de donde saca la info. estos generalmente están en “/usr/lib/pkgconfig”.
Pero como no podía ser de otra manera, hay distros, (o paquetes) que instalan esos archivitos *.pc en otro lugar, y el programa no puede encontrarlos. para solucionar esto solo hay que copiar el archivo *.pc y la librería ( *.so o *.so.* ) a la carpeta donde si los encuentre (osea “/usr/lib/pkgconfig” ).
Otra forma es hacer un enlace duro, pero este es un tema aparte, y es menos “natural” para la lógica del usuario medio (bajo)

Si es un binario lo que se quiere encontrar, el tema es mucho mas simple. Estos se buscan en el PATH. pueden ejecutar desde la consola lo siguiente para ver cuales son las carpetas donde se busca. “echo $PATH”
si quieren que algo “pueda ser encontrado”, solo ponganlo en alguna de esas carpetas

Cuando nosotros ejecutamos el ./configure, este script busca los programas antes mencionados, y ubica cualquier cosa que se necesite. de esta manera se genera el MAKEFILE necesario.

¿como se yo donde buscar?
Una vez que leyeron lo anterior pueden pensar ¿ y como se donde buscar yo, si los archivos no están en su ubicación estándar?
pueden usar los siguientes programas.
whereis y locate.
whereis devuelve poca info, generalmente solo los binarios y las paginas de man.
locate devuelve TODO lo que coincida con el patrón de búsqueda. Locate usa una base de datos de los archivos en el disco rígido.
Lo mas probable es que estemos buscando algún archivo que acabamos de instalar, así que HAY que reconstruir esa base usando el comando updatedb (y esperando un rato)

Makefiles Y make.
Cuando el código es pequeño, se puede compilar con solo ejecutar el compilador (por ejemplo “gcc codigo.c”)
Pero cuando el código crece en complejidad, hay que usar muchos parámetros para el compilador. si nosotros tuviéramos que saberlos (o investigarlos), entonces para compilar habría que tener un “titulo universitario en compilación”. para eso esta la utilidad make. Este programa al ser invocado, lee los archivos Makefile y hace lo que dicen.(tarea para el hogar, abran un Makefile con su editor de textos preferidos)
NOTA: Estos archivos son creados por el programador, o el IDE que este usando, por lo tanto puede ser que tengan miles de opciones, o que estén simplemente vacíos, o tenga solo lo “básico”
cuando se ejecuta make sin ningún parámetro, este hace las acciones por default del archivo Makefile de la carpeta donde estamos parados (generalmente el default es compilar).
es muy común que también se pueda hacer lo siguiente
make install: copia los binarios y los archivos necesarios para el programa, a donde deberían ir
make uninstall: borra los archivos creados por make install
make clean: borra los resultados de la compilación, y deja solo el código.
una vez ejecutado make install, la carpeta donde estamos trabajando (donde esta el código y los binarios ya compilados) no completamente necesaria. entonces recomendable ejecutar make clean para liberar espacio en disco. si son extremistas, pueden borrar todo, menos los Makefiles, ya que son la única manera de desinstalar

Números de versión.
Muchas veces, y en el apuro leemos que configure no encuentra una librería, o paquete y nos mandamos a instalarlo.y en realidad lo que pasa es que esta instalado, pero necesita una versión mas nueva.
A la hora de actualizar librerías, tienen que tener en cuenta que es un tema delicado, y si tienen un distro medio vieja (mas de un año) pueden generar que otros paquetes deban ser actualizados, y se genere un efecto cascada, y terminen necesitando actualizar todo.
Por esto, muchas veces es preferible no actualizar a la ultima versión existente, sino solo a la requerida. para esto google es un aliado. poniendo el nombre y la versión, seguramente encontraran un repositorio con el archivo buscado.

Paso a paso
1º bajar el archivo con el codigo fuente
2º descomprimirlo en una carpeta. (y hacer cd hasta esa carpeta)
lo mejor es usar una carpeta dentro de tu home, por ejemplo ~/src (~ = /home/TuNombreDeUsuario )
3º leer el archivo INSTALL y README (muchas veces tiene tips importantes)
4º tipear “./configure” y esperar hasta que termine
5º Si termino mal, probar con lo explicado antes
6º si termino bien, tipear make y esperar. Si este falla es porque hay algún problema en el codigo. lo único que se puede hacer es bajarse otra versión
7º hacer su -c “make install” (o sudo , o loguearse como root)
8º para limpiar tipear “make clean”, (siempre conviene leer el Makefile para ver si hay otras opciones)
9º disfrutar de nuestro/a programa/librería

2 comentarios para “Tips para compilar”

  1. Fernando Dice:

    Hola,enhorbauena por el blog,esta muy bien. Una pregunta. el makefile tiene q estar en la misma carpeta q mi programa no? y los programas q yama el makefile?? Estoy probandolo en windows cn el Dev-c++ y lo del make y demas tampoco se hacerlo…

  2. Rogelio Dice:

    Tengo una duda, para verificar cosas como bibliotecas y compiladores que se vana usar para generar nuestro programa con make, la verificacion de estos solo se puede hacer con el script configure o se puede hacer directamente adentro del makefile?

    De antemano gracias.

Escribe un comentario