¿Dónde está la IDE en Linux? ¿Cómo compilo?

La filosofía UNIX tradicional consiste en evitar grandes programas monolíticos que hacen de todo. La idea es combinar múltiples pequeñas utilidades para hacer lo que se quiere. Esta es la forma clásica de hacer las cosas, pero igual se pueden usar "IDE"s.

Editores de texto

Primero hay que escribir el programa. Un programa en C es un archivo de texto, entonces hay que utilizar alguno de los muchos editores de texto que hay disponibles. El editor clásico es el "vi", y si uno se dedica a temas de Unix no está mal conocerlo, puesto que.. ¡este editor fue incluido en todos los sistemas Unix instalados en los últimos treinta años!

Sin embargo el vi es un editor complicado. Si bien versiones más modernas (como el vim) superan un poco sus complejidades, el vi arrastra demasiada historia como para recibir amistosamente a los recién llegados. Un editor de textos simple y muy recomendable es el "joe". Está en todas las distribuciones (en Debian/Ubuntu se instala con apt-get install joe, y en RedHat/CentOS con yum install joe).

Compilando

Cuando queremos compilar un programa de C, la herramienta que necesitamos es el GCC. Y este a su vez necesita varios otros programas. Para bajar e instalar el GCC y el make (que describo más adelante) en Debian o en Ubuntu simplemente podemos ejecutar sudo apt-get install gcc g++ make manpages-dev libc6-dev.

El GCC una vez que yq está instalado se ejecuta así:

gcc [-pthread] [-O2] [-Wall] [-g] [-c] [-o archivo] fuente.c

...y esto es lo que significan las opciones:

-pthread
Se debe usar cuando el programa utiliza threads. Si no sabés lo que son, entonces no uses esta opción =).
-O2
Activa las optimizaciones al compilar. Al depurar un programa es útil no activar esto, para poder seguirlo mejor. Pero el código que se genera sin esta opción es mucho menos óptimo.
-Wall
Activa los "warnings" de compilación. Esta opción se debe usar siempre, porque es tremendamente útil para encontrar errores. El GCC es muy bueno dando avisos al programador en comparación a otros compiladores.
-g
Incluye información de depuración en el ejecutable. Esta información puede ser usada por el debugger GDB.
-c
Sólo compilar para generar el código objeto (lo que en Windows sería "el .obj"): no linkear (enlazar).
-o archivo
Especifica cómo se llama el archivo de salida.

Si el programa está escrito en C++ en vez de en C, entonces hay que compilarlo (y linkearlo) no con "gcc" sino con "g++". Es importante también usar g++ en el momento del linkeo porque así GCC automaticamente incluirá las bibliotecas que C++ necesita.

Cada archivo fuente a ser compilado requerirá una ejecución separada de gcc (o g++). Y cada una de esas ejecuciones producirá un archivo con extensión .o. Todos los archivos .o "linkeados" (o "enlazados") producirán luego el ejecutable final. La manera tradicional de organizar está ejecución coordinada de programas que producen cosas que a su vez producen otras cosas es por medio de la herramienta make.

Uno corre make qué_cosa donde qué_cosa es un objetivo. Make lee sus definiciones de objetivos de un archivo Makefile situado en el directorio actual. Su sintaxis es la siguiente:

objetivo: lista de archivos de los que depende
<tab>comando 1
<tab>comando 2
...

objetivo2: ...
...

Al integrar el comando GCC con el make no hace falta tipear todas estas opciones. Make tiene conocimiento implícito de cómo derivar archivos con ciertas extensiones a archivos con otras extensiones. Es decir que si en un pedazo de Makefile ponemos...

mijuego: mijuego.o
	cc -o mijuego mijuego.o # linkeamos!!!

... entonces make va a saber que para el ejecutable "mijuego" necesita un archivo .o. Al no encontrarlo buscará desde qué otro archivo se puede generar. Si encuentra un mijuego.c, entonces intentará solito compilar el .c para generar el .o. Mediante ciertas variables de make uno puede intervenir en este proceso automático para opinar sobre cuáles opciones adicionales se deben emplear. Además, existe una variable de make específica para evitar poner a mano el nombre del compilador de C. Esta variable es $(CC). En total quedaría así:

# quiero que todo se compile optimizado, con info de depuración y
# quiero ver warnings de compilación.
CFLAGS=-O2 -g -Wall

mijuego: mijuego.o
	$(CC) -o mijuego mijuego.o # linkeamos!!!

Si el programa es en C++ se debe reemplazar CFLAGS por CXXFLAGS, además de cambiar el cc del linkeo por c++ (o $(CC) por $(CXX) ).

Nota: cc es el nombre que tiene el compilador de C en todos los sistemas UNIX, en Linux cc es solamente otro nombre para el GCC.

Editores integrados (IDEs)

Se conoce como IDE a los editores que integran todos las utilidades típicas utilizadas en la programación. Una IDE se encarga solita de llamar al compilador y de o bien llamar a make o suplir su funcionalidad él mismo.

Entonces, si después querés experimentar con alguna IDE podés probar Eclipse (necesita Java), que si bien su razón de existir principal es proveer para los desarrollos en Java, ofrece un buen soporte para el desarrollo de aplicaciones C y C++ (bajar la versión que dice "Eclipse IDE for C/C++ Developers").

Otro editor que parece interesante es Anjuta, que integra al editor de interfaces gráficas Glade.


Mis otros artículos sobre programación en Linux.


Por Nicolás Lichtmaier. Cualquier comentario o pedido de mayor claridad o extensión será bien recibido.