Publicado el 6 de Agosto del 2017
1.376 visualizaciones desde el 6 de Agosto del 2017
530,5 KB
31 paginas
Creado hace 18a (02/03/2007)
casidiablo.blogspot.com
[C/C++] El entorno de programación en Linux
Este artículo pretende orientar un poco acerca de lo que es la programación en
C++ sobre linux. Esto NO es un tutorial de referencia de C++, si lo que buscas
es eso puedes buscar en el google que hay bastantes. Posiblemente ya hayas
programado en C++ sobre Windows, y has utilizado algún compilador como el
C++ Builder de Borland, el Visual Studio de Microsoft o en el mejor de los casos
DevC++.
Ok, esto es un buen comienzo. Pero lo que aquí vamos a ver es: qué nos
proporciona Linux para programar en C++. Como sabes en Linux las cosas ya
no son tan fáciles, pero tampoco difíciles; de hecho C++ es famoso gracias a
Linux, son como uña y mugre. La cuestión es que nos centraremos en la
programación desde la consola. Si lo tuyo no es la consola puedes echarle un
vistazo a la sección que trata sobre Anjuta, que es un IDE para C++ en Linux,
pero te recomiendo que leas todo el artículo, te aseguro que te servirá.
Vamos a tratar los siguientes temas (y talvez algunos más):
● Editores
● Compiladores
● Bibliotecas y enlace
● Creación de archivos ejecutables con make
● Depuración con gdb
● Control de versiones con RCS y CVS
● Creación de documentación para el comando man
● Anjuta, un IDE para Linux
Lo que estás a punto de leer es la base de la programación en C++: cruda, sin
vestimentos, tal como es.
Uso de los editores de Linux
Como ya debes saber, lo primero que necesitamos para programar es un editor
de texto. Uno de los primeros resultados del proyecto GNU fue el editor emacs,
y los editores estuvieron entre los primeros programas que fueron portados a
Linux.
Pero vamos a centrar nuestra atención en el editor vim, el cual es básicamente
una interfaz basada en pantallas escrita con base en ex (otro editor muy
antiguo).
En la mayoría de los distros de Linux encontrarás el editor vim. Aunque muchas
por Cristian Castiblanco
personas piensan que vim es enigmático y difícil de utilizar, por lo general es
porque nos acostumbramos al bloc de notas de Windows, emacs (en modo
gráfico) y/o a los IDE's (a lo fácil); sin embargo, vim tiene muchas ventajas con
respecto a otros editores:
casidiablo.blogspot.com
● Está disponible en prácticamente en todos los sistemas UNIX y Linux.
● Necesita menos recursos de sistema que emacs, y por consecuencia se
ejecuta aunque el sistema no esté funcionando completamente.
● No es tan personalizable como el emacs, por lo que sus
implementaciones se comportan casi de la misma manera.
Puedes utilizar cualquier otro editor de texto, aunque te recomiendo que
domines los fundamentos del vim. Para comenzar puedes leerte este pequeño
(muy pequeño) artículo acerca del vim.
ctags y etags
Al codificar un programa grande en C++, talvez sea necesario dividir las clases
y métodos en archivos fuente separados. Pero después, al depurar el
programa, puede resultar tediosa la tarea de navegar entre archivos. Por
ejemplo, talvez esté editando el archivo A y en él haya una invocación a un
método que se encuentre en otro fichero, talvez el B. Los programas ctags y
etags generan archivos índice o “tag”, que vi y emacs pueden utilizar para
ayudarlo a navegar por sus archivos fuente.
ctags genera marcas para vim, pero se puede configurar para que lo haga para
emacs. etags genera marcas para emacs, pero se puede configurar para que lo
haga para vim.
Vamos a ver un ejemplo del ctag con vim. Para ello escribimos el siguiente
código en un archivo llamado HolaPrincipal.cpp:
//HolaPrincipal.cpp
#include<iostream>
using namespace std;
void Saludar(int i);
int main(int argc, char * argv[])
{
for(int i=0; i<5; i++)
{
Saludar(i);
cout<<endl;
}
}
y lo siguiente en Saludar.cpp:
//Saludar.cpp
#include<iostream>
using namespace std;
void Saludar(int i)
{
cout<<"["<<i<<"] elhacker
r00lz";
}
Ahora vamos al directorio donde tenemos los dos archivos y escribimos el
comando:
ctags *.cpp
por Cristian Castiblanco
casidiablo.blogspot.com
Hemos creado el nuevo archivo tags. Ahora vamos a probarlo, para ello
abrimos el archivo HolaPrincipal.cpp (vim HolaPrincipal.cpp); y usando las
flechitas de dirección colocamos el cursor sobre la palabra Saludar. Oprime
Ctrl+], y verás que el editor abre automáticamente el archivo que contiene la
función (Saludar.cpp) y coloca el cursor al inicio de la misma.
Como he dicho anteriormente solo centraremos la atención al vim, para el
emacs puedes manejar tanto el ctags como el etags. Utiliza la información en
línea para ver como se utiliza.
gcc y g++
El compilador C de GNU se llama gcc y puede compilar C, C++ y Objective-C.
El compilador de C se apega al estándar ANSI, por lo que es fácil de portar un
programa C ANSI a Linux.
Cómo compilar con gcc
El compilador GNU se invoca con el comando gcc. De manera predeterminada
este comando preprocesará, compilará y en enlazará un programa de C.
Existen muchas opciones para el gcc, y entre ellas existen controles que
permiten ejecutar
secuencia
preproceso/compilación/enlace.
solo alguna
fase de
la
El siguiente ejemplo sencillo es un programa en C que simula el lanzamiento de
un dado n veces, y luego imprime el número de veces que sale cada una de
sus caras. Nota: El ejemplo lo saqué de un libro de C, espero no me demanden.
Crea el archivo juego.c:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int tirarDado(void);
int main(int argc, char * argv[])
{
int i, iIter, dado[6];
if(argc<2)
{
printf("Uso: %s n\n",argv[0]);
return 1;
}
por Cristian Castiblanco
casidiablo.blogspot.com
iIter = atoi(argv[1]);
memset(dado, 0, sizeof(dado));
for(i=0; i<iIter; i++)
{
dado[tirarDado() 1]++;
}
printf("%d tiradas\n",iIter);
printf("\tCara\tTiradas\n");
for(i=0; i<6; i++)
{
printf("\t%d : \t%d\n",i+1, dado[i]);
}
}
Y el archivo tirador.c:
#include<stdlib.h>
int tirarDado(void)
{
return (rand()%6+1);
}
Podríamos utilizar un solo comando para compilar y crear el programa
ejecutable:
gcc o juego juego.c tirador.c
Puede ver que -o indica el nombre del archivo de salida (el ejecutable). gcc
sabe que los archivos con la extensión *.c son archivos de C y los compila
como tales. Sino especifica un nombre de archivo de salida, gcc creará
predeterminadamente el archivo a.out.
Ahora veamos otra manera de compilar nuestro programa: haciéndolo por
módulos (por separado):
gcc c juego.c
gcc c tirador.c
gcc o juego juego.o tirador.o
En este caso indicamos al compilador, con la opción -c, que primero el archivo
juego.c, luego el archivo tirador.c. Y por último le indicamos que cree el archivo
binario ejecutable, utilizando los dos archivos objeto (resultados de la
compilación): juego.o y tirador.o.
Cómo compilar con g++
El comando g++ nos permite compilar archivos de C++. Aunque gcc puede
compilar programas de C++, no hace automáticamente todos los enlaces
requeridos con las bibliotecas de clases. Necesita usar g++ para esto. Por ello
es recomendable que utilices g++ si estás utilizando C++.
por Cristian Castiblanco
Ahora vamos a compilar la versión C++ de nuestro programa de los dados; el
archivo juego.cpp:
casidiablo.blogspot.com
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
int tirarDado(void);
int main(int argc, char * argv[])
{
int i, iIter, dado[6];
if(argc<2)
{
cout<<"Uso: "<<argv[0]<<" n\n";
return 1;
}
iIter = atoi(argv[1]);
memset(dado, 0, sizeof(dado));
for(i=0; i<iIter; i++)
{
dado[tirarDado() 1]++;
}
cout<<iIter<<" tiradas\n";
cout<<"\tCara\tTiradas\n";
for(i=0; i<6; i++)
{
cout<<"\t"<<i+1<<" : \t"<<dado[i]<<endl;
}
}
El archivo tirador.cpp:
#include<stdlib.h>
int tirarDado(void)
{
return (rand()%6+1);
}
La compilación en g++ es muy similar a gcc en casi todos los aspectos. Para
compilar con un solo comando utiliza:
g++ o juego juego.cpp tirador.cpp
Y para compilar por módulos:
g++ c juego.cpp
g++ c tirador.cpp
g++ o juego juego.o tirador.o
ELF
Cuando se compila un programa, se genera un archivo objeto, y cuando se
enlaza el programa, se crea un archivo binario ejecutable. El enlazador debe
por Cristian Castiblanco
casidiablo.blogspot.com
entender el formato de los archivos objeto, y como el sistema operativo debe
cargar y ejecutar el programa ejecutable, también debe entender este formato.
Ya vio que el archivo ejecutable por defecto se llama a.out. Hace un tiempo, el
formato de los archivos objeto y los archivos ejecutables se conocía como
a.out. Este formato es muy antiguo y contiene bastantes defectos. El formato
actual, utilizado por los sistemas UNIX y Linux se conoce como ELF (Formato
Ejecutable y de Enlace). ELF es mucho más versátil que a.out, y se presta muy
bien para crear bibliotecas compartidas (librerías dinámicas).
Puede saber cual es el formato de un archivo utilizando el comando file, por ej.:
file juego tirador.o /usr/bin/aptget
juego: ELF 32bit LSB executable, Intel 80386...
tirador.o: ELF 32bit LSB relocatable, Intel 80386...
/usr/bin/aptget: ELF 32bit LSB executable, Intel 80386...
Bibliotecas compartidas
A veces, varios programas necesitan hacer las mismas cosas, como E/S por
ejemplo. Hace ya bastante tiempo se desarrolló el concepto de biblioteca (o
librería) para adaptar est
Comentarios de: [C/C++] El entorno de programación en Linux (0)
No hay comentarios