lundi 18 février 2013

ANEJOS.linux 2013

  1. 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

Aucun commentaire:

Enregistrer un commentaire