Tag Archive for 'Trucos'

Enlazar una libreria con GCC

El problema: Tienes librerias personales que tú mismo creaste, o bien librerías sin instalar que no estan en /usr/lib sino en otros directorios raros y quieres enlazar con gcc.

La solución: Se debe indicar a gcc en donde estan las librerias usando -L<dir>, luego enlazarlas como librerías normales usando -l<name>. Por ejemplo para enlazar la librería /home/user/tmp/libtrompete.a:

gcc -L/home/user/tmp/ -ltrompete main.cpp

Nota que solo se le indica el nombre trompete, porque gcc le agrega lib+trompete = libtrompete. GCC también busca automáticamente si es .o, .so o si es una AR .a.

Debugging con el ‘cerdo’ y con std::cerr

Es muy útil hacer debugging con std::cerr, y si usas:

#include <iostream>
using namespace std;
main(blabla...){
  cerr << "This is a debug message" << endl;
}

Todo funciona maravillosamente, hasta que tus 20 threads comienzan a vomitar cientos y cientos de mensajes que hacen imposible leer el debug. Para ello lo ideal sería definir “debug levels”. Hay dos formas la forma simple y tonta:

#ifdef DEBUG_N
  cerr << "This is a debug message" << endl;
#endif

Pero esa forma es muy fastidiosa, así que mejor definimos un ‘cerdo‘ (cerdo = cerr debug output). O incluso mejor un cerdo con niveles: cerdo, cerdo2, cerdo3,… , cerdoN. He aqui uno para 3 niveles (donde hacemos que cerdo=cerdo1):

// ----- cerdo.h -----
#ifndef DEBUG
  #define cerdo if(0) cerr
  #define cerdo1 if(0) cerr
  #define cerdo2 if(0) cerr
  #define cerdo3 if(0) cerr
endif
#if (DEBUG==1)
#define cerdo cerr
  #define cerdo1 cerr
  #define cerdo2 if(0) cerr
  #define cerdo3 if(0) cerr
#endif
#if (DEBUG==2)
#define cerdo  cerr
#define cerdo1 cerr
  #define cerdo2 cerr
  #define cerdo3 if(0) cerr
#endif
#if (DEBUG==3)
  #define cerdo  cerr
  #define cerdo1 cerr
  #define cerdo2 cerr
  #define cerdo3 cerr
#endif
// ---- end cerdo.h ----

Ahora solo queda usar los cerdos.

#define DEBUG 2
#include "cerdo.h"
using namespace std;
main(blabla...){
  cerdo << "This is a debuglevel 1 message" << endl;
  cerdo1 << "This is a debuglevel 1 message" << endl;
  cerdo2 << "This is a debuglevel 2 message" << endl;
  cerdo3 << "This is a debuglevel 3 message" << endl;
}

Bye. Continue reading ‘Debugging con el ‘cerdo’ y con std::cerr’

Merge del trunk a una branch

Hay dos formas, directo del repositorio y usando una copia local del trunk.

Directo del repositorio

$ svn merge -r START:END http://repo/svn/trunk /directorio/branch

De una copia local:

$ svn up /directorio/trunk
$ svn merge -r START:END /directorio/trunk   /directorio/branch

Cualquiera de las dos anteriores te hace un merge a la copia local que está en /directorio/branch.

Para finalmente subir (a la branch) los cambios obtenidos

$ svn ci -m "Merge del trunk a mi branch START:END"  /directorio/branch

Si no se pusieron de acuerdo tus programadores, probablemente salgan conflictos, arreglalos.

Subversion: cómo hacer un merge de una branch al trunk

  1. Hacer un check out del trunk:
    svn co svn+ssh://server/path/to/trunk
  2. Hacer check out de la rama (branch) que vamos a fusionar (merge):
    svn co svn+ssh://server/path/to/branch/myBranch
  3. Entrar a “myBranch”
  4. Encontrar la Revision donde nació “myBranch”:
    svn log --stop-on-copy

    Tomar nota de la revisión rXXXX donde nació la branch.

  5. Entrar al directorio del trunk.
  6. SVN update:
    svn up

    Lo cual actualizará los ultimos datos del trunk, tomar nota de la revisión “At revision YYYY” (debería ser mas grande que rXXXX).

  7. Hacer un SVN merge:
    svn merge -r XXXX:YYYY svn+ssh://server/path/to/branch/myBranch

    Lo cual hace un merge de la branch en el trunk (la copia local)

  8. Arreglar conflictos de archivos en caso de haberlos
  9. Check in para subir el trunk actualizado (merged) al server:
    svn ci -m "Hice un MERGE de la branch myBranch [XXXX]:[YYYY] al trunk”

Listo.

AR archives, Shared objects y Static Objects: .a, .o , .so

Cómo convertir un AR archive (.a) lleno de static objects (.o) a un Shared Object (.so)

a files are just (ar) archives of .o object files, so all you need to do is unpack the archive and repackage them as a shared object (.so).

ar -x mylib.a
gcc -shared *.o -o mylib.so

¿Cannot talk to klauncher?

Suele pasar en Gnome abriendo cosas de KDE de vez en cuando.

  1. :~$ dcopserver_shutdown
  2. :~$ kdeinit
  3. Listo

Pasa cuando sales de Gnome con CTRL-ALT-BACKSPACE, lo mejor seria meterlo en el inicio de sesion de Gnome.

Microsoft Lifecam VX-6000 = Microdia

No le creas a las malas lenguas que dicen que la cámara Microsoft Lifecam VX-6000 (045e:00f4) no funciona en linux. La verdad es que sí funciona. Dale lsusb, y si te sale 045e:00f4 simplemente instala el driver de Microdia pero asegurate de aplicarle el parche. Aunque, ten cuidado, tal vez para el momento que leas esto el parche ya estará en el GIT y no haga falta, chécalo antes.

Lifecam VX 6000 funciona en Linux

Si compilas el parche y si no quiere insertarlo, tal vez te haga falta insertar primero los módulos

# modprobe videodev
# modprobe compat-ioctl32

Y luego meter el driver de microdia recien compilado.

# insmod ./microdia.ko

Sí funciona, me consta porque yo tengo varias funcionando y funcionando bien. Así que si no puedes el error esta entre la silla y el teclado. Y si nada funciona, tal vez Continue reading ‘Microsoft Lifecam VX-6000 = Microdia’