- ESIISS: Aprenda Linux como si estuviera en Primero página 64
12. ANEJOS
12.1 Compilado de programas en Linux
Linux como cualquier sistema Unix que se precie incluye un compilador de C y C++. Esto no
implica que se esté limitado a estos dos lenguajes de programación. Por el contrario existen una
gran cantidad de compiladores gratuitos para los lenguajes más importantes.
El compilador de C/C++ de Linux es un compilador de línea de comandos, esto es, no dispone de
ninguna interfaz gráfica que facilite la programación y compilación del código. Existen eso sí
editores de texto capaces de mostrar la sintaxis del código resaltada como kwrite, aunque la
compilación hay que realizarla manualmente a través de una consola o terminal.
12.2 Compilación y linkado
El primer paso para crear un programa, por ejemplo en C++, es crear el fichero de código fuente, y
guardarlo en un fichero de texto por ejemplo e1.cpp. Tras esto hay que compilar el programa. Para
esto se empleará el comando g++, de la siguiente forma:
g++ e1.cpp
Con lo que conseguiremos que se compile el programa. Con este comando hemos conseguido que
se cree un programa llamado a.out en el directorio de trabajo. Para ejecutarlo emplearemos
./a.out
Normalmente no desearemos que el programa se llame a.out sino que tenga un nombre más
significativo, como ejemplo_1, para conseguirlo emplearemos:
g++ -o ejemplo_1 e1.cpp
Si queremos ejecutar el programa emplearemos ./ejemplo_1. Si el programa escrito realiza emplea
alguna función que no se encuentre en la librería estándar hay que incluirla en la orden de
compilación, por ejemplo:
g++ -o ejemplo_2 e2.cpp -lname
Donde name es el nombre de la librería. Por defecto estas se guardan en un fichero cuyo nombre es
libname.so, cuya localización suele ser /usr/lib.
Si el programa no está escrito en C++ sino en C las opciones de compilación son las mismas salvo
que en lugar del programa g++ se empleará el comando gcc.
gcc –o ejemplo_3 e3.c
12.3 Comando make
Este comando sirve para organizar la compilación y el enlazado de programas complicados que
dependen de muchos módulos y librerías diferentes. Cuando se ejecuta este comando, se construye
un nuevo ejecutable volviendo a compilar sólo aquellos ficheros fuente que son más recientes que el
los ficheros compilados correspondientes, teniendo en cuenta para ello las fechas de última
modificación de cada fichero.
Capítulo 12: ANEJOS página 65
Este comando se basa en un fichero ASCII (llamado por defecto makefile) que contiene una
relación de dependencias entre los distintos módulos, así como las acciones que hay que realizar
para poner a punto cada módulo, es decir para pasar de un fuente a un objeto, por ejemplo. Este
comando tiene la siguiente forma general:
make [–f makefilename] [–arg_opt] [exe_name]
El fichero makefile (con éste o con otro nombre invocado por medio de la opción –f) contiene
cuatro tipos de líneas diferentes:
•= Líneas de comentario, que comienzan por el carácter (#). Si en una línea cualquiera aparece el
carácter (#), se ignora todo lo que aparece a continuación de dicho carácter en dicha línea.
•= Líneas de definición de macros. Tienen la forma general,
IDENTIFICADOR = cadena_de_caracteres
Si en alguna otra línea aparece (IDENTIFICADOR), dicha ocurrencia se sustituye por
cadena_de_caracteres. No es necesario que el nombre del identificador esté escrito con
mayúsculas, pero es una costumbre bastante extendida el hacerlo así. Mediante el uso de macros se
pueden representar brevemente pathnames o listas de nombres de ficheros largos. Si el identificador
tiene una sola letra, no hace falta poner los paréntesis. El comando make tiene una serie de macros
definidas por defecto que se pueden listar con el comando make –p.
Líneas describiendo las relaciones de dependencia. Tienen la forma,
file.o fila.o ... : file1.cpp file2.cpp ...
La lista de ficheros que están a la izquierda del carácter (:) dependen de los ficheros que están a la
derecha. En estas líneas se realiza la sustitución habitual de los caracteres (?*[])
Líneas de comandos shell, comenzando siempre por un tabulador. Estas líneas representan las
acciones que hay que realizar para actualizar los ficheros dependientes, según las relaciones de
dependencia descritas en la línea anterior. En una misma línea de comandos puede haber varios
comandos separados por un carácter (;), y de este modo se ejecutan en un mismo proceso; si hay
varias líneas de comandos, cada línea se ejecuta en un proceso diferente. Estos comandos shell
(compilaciones, etc.) se ejecutan o no según las fechas de los ficheros correspondientes. Hay
también una lista de dependencias implícitas y de macrodefiniciones standard que se pueden obtener
con el comando make -p (la salida de este comando puede tener varios cientos de líneas). A
continuación se presentan algunos ejemplos de ficheros makefile.
A continuación se muestran una serie de ejemplos
# Esto es un ejemplo de fichero makefile
# Definiciones de macros
ma = ma27ad.o ma27bd.o ma27cd.o
TEST: test.o (ma)
xlf –o TEST –O (ma)
test.o: test.f
xlf –c –O test.f
ma27ad.o: ma27ad.f
ESIISS: Aprenda Linux como si estuviera en Primero página 66
xlf –c –O ma27ad.f
ma27bd.o: ma27bd.f
xlf –c –O ma27bd.f
ma27cd.o: ma27cd.f
xlf –c –O ma27cd.f
Hay informaciones que no es necesario dar por que se suponen por defecto. Por ejemplo, si el
fichero objeto (.o) y el fichero C (.c) o C++ (.cpp) tienen el mismo sufijo, no hace falta definir esas
relaciones de dependencia, que por otra parte son triviales.
12.4 Búsqueda avanzada en ficheros. Expresiones regulares
A veces se desea encontrar las líneas de un fichero que contienen una palabras o palabras
determinadas. Cuando el texto que se desea encontrar es único, lo que hay que hacer es ponerlo tal
cual en la sección del comando que define la búsqueda, por ejemplo
grep "PATATAS" Lista_de_la_compra.txt
Sin embargo, en otras ocasiones el texto que se desea buscar no es único, es decir, no está
unívocamente determinado como en el ejemplo anterior, sino que debe cumplir unas ciertas
condiciones, como la de estar escrito con mayúsculas, comenzar por determinado carácter, estar a
principio o final de línea, etc. Este problema se puede resolver en muchos comandos de Linux por
medio de las expresiones regulares que se van a presentar a continuación.
Las expresiones_regulares son una forma de describir patrones para la búsqueda de unas
determinadas líneas dentro de uno o más ficheros ASCII. Se trata pues de encontrar las líneas cuyo
contenido cumple ciertas condiciones, que se definen en la expresión_regular.
12.4.1 Caracteres especiales
En una expresión_regular se pueden utilizar algunos caracteres que tienen un significado especial.
Son los siguientes:
[ comienzo de la definición de un conjunto de caracteres
. un carácter cualquiera, excepto el <eol>
* un conjunto de caracteres cualesquiera, excepto el primer carácter de una expresión o
inmediatamente después de la secuencia \(
] terminación de la definición de un conjunto de caracteres
- sirve para definir el conjunto de caracteres que van del que le precede al que le sigue. Si va
detrás del [ o delante del ], no es especial
ˆ comienzo de línea, si está al comienzo de la expresión
ˆ conjunto complementario (el que no cumple la condición), si está justo después del [ que
abre la definición de un conjunto
fin de línea, cuando está al final de una expresión
Capítulo 12: ANEJOS página 67
\ quita el significado especial a un carácter, excepto en la definición de un conjunto de
caracteres
12.4.2 Expresiones regulares de un solo carácter
Se trata de buscar palabras o conjuntos de un solo carácter, que cumple ciertas condiciones. A
continuación se presentan algunos ejemplos:
\* representa el carácter *
. cualquier carácter, excepto el <eol>
[a-f] un carácter cualquiera entre la a y la f
[A-Z] cualquier letra mayúscula
[ˆa-d] cualquier carácter que no sea una letra entre la a y la d
[:clase:] donde clase puede ser: digit (cifra del 0 al 9), xdigit (cifra hexadecimal), alpha (letra
cualquiera), upper (letra mayúscula), lower (letra minúscula), alnum (letra o dígito cualquiera),
space (un espacio en blanco), cntrl (carácter de control), punct (un carácter de puntuación) y print
(carácter imprimible).
12.4.3 Expresiones regulares generales
Se pueden formar de acuerdo con las siguientes reglas:
- una expresión regular de un sólo carácter
[a-z] cualquier letra minúscula
- una expresión regular de un sólo carácter, seguida del carácter *, representando entonces
todas las palabras de longitud positiva o nula que se pueden construir con los caracteres aceptados
por la una expresiones regulares de un sólo carácter
[a-z]* cualquier palabra escrita con minúsculas
- concatenando (poniendo una a continuación de la otra) dos expresiones regulares construidas
previamente
[a-z][A-Z] cualquier palabra de dos letras, de las cuales la primera es minúscula y la segunda
mayúscula
- Una expresión_regular definida en la forma \(expresiones regulares\) representa la propia
expresiones regulares (es decir, definida ella sola), pero define una forma de referirse luego a esa
expresiones regulares. En efecto las expresiones regulares definidas de esta forma quedan afectadas
por un número del 1 al 9, y es posible luego hacer referencia a una expresiones regulares por medio
del número que le corresponde, en la forma \número. Si \número va seguido de un *, esa
subexpresión puede repetirse un número cualquiera de veces
lundi 18 février 2013
ANEJOS.linux 2013
Inscription à :
Publier les commentaires (Atom)
Aucun commentaire:
Enregistrer un commentaire