lunes, 31 de enero de 2011

¿Cómo implementar una librería estática usando C++ en GNU/Linux?

En este post se explica lo fácil que es realizar una librería estática.
Para explicarlo, vamos a considerar un fichero que ni si quiera contiene una clase (para simplificar las cosas) que usa una llamada a una función getchar() como la de Pascal o getch(), getche() de la libreria conio.h que se usa en Windows.

Supongamos el siguiente fichero nstdio.h

#include <iostream> #include <string> #include <sstream> #include <fstream> #include <cstdlib> using namespace std; static bool isGenerated = false; const string readCharScript[7] = {"#!/bin/sh" , "tput smso", "tput rmso", "oldstty=`stty -g`", "stty -icanon min 1 time 0", "dd bs=1 count=1 of=output >/dev/null 2>&1", "stty \"$oldstty\"" }; void resetOutputFile() { ofstream outputFile( "output", fstream::out ); outputFile << "$"; outputFile.close(); } void GenereFile() { resetOutputFile(); ofstream readFile( ".readone", fstream::out ); for ( int i = 0; i < 7; i++ ) readFile << readCharScript[i] << endl; readFile.close(); system("chmod ugo+x .readone"); isGenerated = true; } char getch() { if (!isGenerated) GenereFile(); system("./.readone"); const int EOL = '$'; char ch; ifstream file("output", fstream::in); while (ch == EOL) file >> ch; file.close(); resetOutputFile(); return ch; }



Ahora un fichero nstdio.cpp que lo incluya.

#include "nstdio.h"



[airam~/Documentos/lib]-> g++ -Wall -c nstdio.cpp
[airam~/Documentos/lib]-> ar -cvq libnstdio.a nstdio.o
a - nstdio.o
[airam~/Documentos/lib]-> ar -t libnstdio.a
nstdio.o

A continuación creamos un fichero test.cpp. Este fichero debe contener las cabeceras de las funciones que se encuentran en la librería y que se van a utilizar.


#include <iostream> char getch(); using namespace std; int main() { char ch = getch(); if (ch == '\n') cout << "Se pulsó intro" << endl; else cout << endl << "El caracter es: " << ch << endl; return 0; }



y lo compilamos de la siguiente manera:

[airam~/Documentos/lib]-> g++ -o test test.cpp libnstdio.a
[airam~/Documentos/lib]-> ./test

No hay comentarios:

Publicar un comentario

Escriba su comentario (no necesita registrarse).