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