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

sábado, 15 de enero de 2011

Un prompt para la consola de Linux.

Un prompt simple para la consola de Linux:


PS1="\[\033[1;33m\][\[\033[1;32m\]\u\[\033[1;32m\]\[\033[0;1;33m\]\w\[\033[0;1;33m\]]-> \[\033[0;0m\]"



Para hacerlo permanente, lo guardamos en .bashrc, por ejemplo así:

echo 'PS1="\[\033[1;33m\][\[\033[1;32m\]\u\[\033[1;32m\]\[\033[0;1;33m\]\w\[\033[0;1;33m\]]-> \[\033[0;0m\]"' > .bashrc

sábado, 8 de enero de 2011

¿Cómo crear un launcher para una aplicación en K/Ubuntu?

Después de haber desarrollado una aplicación, nos encontramos en la situación en la que queremos que un instalador haga lo propio y a parte de copiar el programa y sus "resources" ponga un lanzador en el menú de nuestro GNU/Linux. Para hacer esto hay que crear un fichero por ejemplo: programa.desktop cuyo contenido se muestra más abajo.

Copiar el fichero .desktop en el directorio:
/usr/share/applications/
Y el fichero binario (el programa en sí) en:
/usr/bin/

Contenido de programa.desktop:

#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Encoding=UTF-8
Type=Application
Name=program
TryExec=$(dirname %k)/program
Exec=$(dirname %k)/program
Icon=icon.png
Terminal=false


Ejecutar en la consola:

xdg-desktop-menu install /usr/share/applications/program.desktop --novendor