Etiqueta: eclipse

  • Cómo decirle a Eclipse que el código es C++11

    En un proyecto C++ con Makefile, Eclipse no reconocía la parte de la librería estándar correspondiente a C++11.

    Abriendo el fichero /usr/include/c++/4.8.2/mutex se comprueba que el problema es el valor definido para __cplusplus que Eclipse proporciona al analizador del código.

    Para hacer que Eclipse le diga a su analizador que el código es C++11 hay que hacerlo en la configuración de rutas y macros del preprocesador (Project->Properties->C/C++ General->Preprocessor Include Paths, Macros, etc.: Pestaña «Providers»). Allí hay que añadir el parámetro -std=c++11 al comando utilizado para obtener las características del compilador.

    Una vez añadido, el valor de __cplusplus será 201103L, con lo que se activarán los includes de la librería estándar correspondientes a C++11.

    Edición 5 de enero de 2018:

    En los proyectos C++ con Makefile generado por Eclipse también es necesario indicar la versión C++ si esta no es ISO C++98. Si utilizamos código C++11 sin haber configurado el proyecto Eclipse para soportar esta versión nos dará el correspondiente error en la compilación:

    Para indicarle en esta ocasión al compilador (en el otro caso se indicaba explícitamente en el Makefile) que el código es ISO C++11 se debe acceder a la configuración de las herramientas de construcción del binario (Project -> Properties -> C/C++ Build ->Settings: Pestaña «Tool Settings»). Allí, hay una entrada para seleccionar el «dialecto» que debe entender el compilador, donde habrá que seleccionar ISO C++11 (-std=c++0x) o el que corresponda.

    Referencias:
    C++11 standard library indexing fails, __cplusplus recognized with wrong value

  • Instalar entorno de desarrollo Qt4 en chroot 32 bits

    Para instalar el entorno de desarrollo de Qt4 en el chroot creado en el post Eclipse en chroot 32 bits se descarga desde Qt for Open Source C++ development on Linux/X11 el fichero con los fuentes de Qt4 para Linux/X11 y se instala el paquete libxext-dev (en Requisitos de instalación de Qt para X11 se dan más detalles y otras dependencias ya resueltas o no imprescindibles en este caso):

    dchroot -d
    sudo apt-get install libxext-dev libxrender-dev libglib2.0-dev

    Despues se descomprime el fichero de Qt obtenido (qt-everywhere-opensource-src-4.7.3.tar.gz cuando se hizo esto) y desde el directorio creado se ejecuta la siguiente orden (siempre dentro del entorno chroot):

    ./configure -prefix /usr/local/share/qt4 -developer-build -platform linux-g++-32 -glib

     

    Se acepta la correspondiente licencia comercial o de código abierto, según se desee, y se comienza la compilación e instalación:

    make && sudo make install

     

    Ahora, se obtiene desde el sitio de descarga Qt Eclipse Integration for C++ el plugin de Qt para Eclipse para Linux 32 bits (el construido sobre Qt 4.6.1), y se descomprime en el directorio de la instalación de Eclipse. Una vez hecho se lanza una primera vez Eclipse limpiando su cache para evitar problemas:

    eclipse -clean

     

    Y listo.

  • Eclipse en chroot 32 bits en Kubuntu 10.10 Maverick 64 bits (actualizado para Debian Wheezy 64)

    Acostumbrado a utilizar log4cxx como librería de registro desde C++ en Red Hat intenté hacer lo mismo en Kubuntu 10.10 64bits. Existe un paquete binario que permite la instalación de la librería en su versión de 64 bits, pero no en 32 bits, que es en la arquitectura para la que quería compilar.

    Actualización: ahora, con Debian Wheezy (versión testing pero congelada en el momento de escribir esto) no sé si realmente utilizaré el entorno de desarrollo de 32bits, pero de todas formas introduzco las diferencias en el procedimiento.

    Lo primero que pensé fue en compilar la versión de 32 bits, pero la compilación de los fuentes de Apache Runtime (dependencia de log4cxx) fallaba y no encontraba mucha ayuda en Internet sobre el problema, por lo que decidí buscar una solución que me solucionara este problema y el de otras posibles librerías que quisiera utilizar más adelante y que pudieran dar el mismo problema.

    La solución universal parecía consistir en instalar un entorno de 32 bits y ejecutar las aplicaciones de desarrollo directamente en ese entorno mediante una jaula chroot. A continuación se explica como conseguir este entorno e instalar eclipse y la librería log4cxx en sus versiones de 32 bits.

    El procedimiento se obtuvo desde 32-Bit Chroot How-To, sustituyendo únicamente hoary por maverick, la versión de Kubuntu que utilizo. Con los 5 pasos indicados en ese artículo se consigue un sistema de 32 bits ejecutable en una jaula chroot y con synaptic instalado para poder seguir instalando las aplicaciones que se necesiten.

    A continuación instalé en el sistema de 32 bits Eclipse (desde Eclipse luego instalo el paquete de desarrollo para C++), libcanberra-gtk-module, build-essential, liblog4cxx-dev y, para que se viera de forma agradable gtk2-engines-qtcurve.

    Eso es suficiente para compilar y editar desde el entorno de 32 bits, pudiendo disponer de librerías precompiladas para 32bits como log4cxx.

    Procedimiento completo:

    Paso 1:
    sudo apt-get install dchroot debootstrap
    sudo mkdir /chroot/
    sudo gedit /etc/dchroot.conf

    Añadir la siguiente línea a /etc/dchroot.conf:
    maverick /chroot

    Instalar el sistema base:

    sudo debootstrap --arch i386 maverick /chroot/ http://archive.ubuntu.com/ubuntu


    y, opcionalmente, configurar la localización del sistema enjaulado, desde su propia jaula:

    sudo chroot /chroot/ dpkg-reconfigure locales locale-gen es_ES.UTF-8

    Actualización: Para el caso de Debian Wheezy el contenido de /etc/dchroot.conf es ignorado, ya que dchroot se ha convertido en un simple envoltorio de schroot, mantenido únicamente por comptabilidad, por tanto la siguiente línea habrá que introducirla en /etc/schroot/schroot.conf:

     

    [wheezy32]
    description=Debian Wheezy (testing) 32 bits
    directory=/chroot
    users=mi_usuario
    groups=mi_grupo
    root-groups=root

    En /etc/schroot/schroot.conf se pueden definir múltiples entornos de jaula, cada uno con un nombre. Aquí se le ha dado el nombre wheezy32. Con schroot -l se pueden ver los entornos de jaula disponibles y con schroot –chroot <nombre_jaula> entrar en un intèrprete de comandos dentro de una de ellas. Si no se especifica un nombre de jaula intentará entrar en la que se llame default, devolviendo un error en caso de que no exista.

    Para iniciar el comando debootstrap, se entra en el entorno de jaula deseado y se ejecuta la orden correspondiente:

    schroot --chroot wheezy32
    debootstrap --arch i386 wheezy /chroot/ http://ftp.debian.org/debian

     

    Paso 2:

    Añadir las siguientes líneas al fichero /chroot/etc/apt/sources.list (desde el punto de vista del sistema anfitrión):
    deb http://archive.ubuntu.com/ubuntu maverick main restricted universe multiverse
    deb http://security.ubuntu.com/ubuntu maverick-security main restricted universe multiverse

    Para Debian Wheezy:

    deb http://ftp.pt.debian.org/debian wheezy main contrib non-free
    deb http://ftp.debian.org/debian/ wheezy-updates main contrib non-free
    deb http://security.debian.org/ wheezy/updates main contrib non-free

    Paso 3:
    Desde el entorno chroot (chroot /chroot) actualizar el sistema:
    apt-get update ; apt-get upgrade

    Paso 4:
    En otra sesión de terminal, o saliendo de nuevo de chroot, ejecutar lo siguiente:
    sudo cp /etc/passwd /etc/shadow /etc/group /etc/sudoers /etc/hosts /chroot/etc/

    Editar el fichero /etc/fstab (del sistema real, sí, no del entorno chroot) y añadir las siguientes líneas:
    /home /chroot/home none bind 0 0
    /tmp /chroot/tmp none bind 0 0
    /dev /chroot/dev none bind 0 0
    /proc /chroot/proc proc defaults 0 0
    /media/cdrom0 /chroot/media/cdrom0 none bind 0 0
    /usr/share/fonts /chroot/usr/share/fonts none bind 0 0

    A continuación ejecutar las siguientes órdenes:
    sudo mkdir /chroot/media/cdrom0
    sudo mkdir /chroot/usr/share/fonts
    sudo mount -a

    Crear un fichero /usr/local/bin/do_dchroot con el siguiente contenido:
    #!/bin/sh
    /usr/bin/dchroot -d "`echo $0 | sed 's|^.*/||'` $*"

    En el caso de Wheezy,el fichero sería, por ejemplo para una jaula llamada wheezy32, /usr/local/bin/do_schroot_wheezy32, y su contenido el siguiente:

    #!/bin/sh
    /usr/bin/schroot --chroot wheezy32 --preserve-environment "`echo $0 | sed 's|^.*/||'`" $*

    No olvidar darle permisos de ejecución:

    sudo chmod 755 /usr/local/bin/do_dchroot

    o

    chmod 755 /usr/local/bin/do_schroot_wheezy32

     

    Paso 5:
    Ejecutar las siguientes órdenes para crear un enlace para poder ejecutar synaptic en el entorno chroot directamente desde el entorno anfitrión local.
    dchroot -d
    sudo apt-get install synaptic
    sudo ln -s /usr/sbin/synaptic /usr/sbin/synaptic32
    exit
    sudo ln -s /usr/local/bin/do_dchroot /usr/local/bin/synaptic32
    sudo synaptic32

    Para Wheezy sustituir siempre la llamada a dchroot por la siguiente llamada a schroot:

    schroot --chroot wheeezy32 --preserve-environment

    Paso 6:
    Por último se instala eclipse y algunos paquetes adicionales y se crea el correspondiente enlace (liblog4cxx10-dev no es necesario para Eclipse, pero yo utilizo dicha librería para el log de los programas que desarrollo en C++):
    dchroot -d
    sudo apt-get install eclipse build-essential libcanberra-gtk-module liblog4cxx10-dev gtk2-engines-qtcurve
    sudo ln -s /usr/bin/eclipse /usr/bin/eclipse32
    exit
    sudo ln -s /usr/local/bin/do_dchroot /usr/local/bin/eclipse32
    eclipse32

    Si ya se había utilizado Eclipse en el entorno de 64 bits, a menos que se utilice un directorio home distinto en las versiones de 32 y 64 bits (no inluyendo o modificando la línea de /etc/fstab que monta /home en /chroot/home), será necesario eliminar el directorio ~/.eclipse y el .metadata de nuestro espacio de trabajo. Además hay que dejar de utilizar el Eclipse de 64bits si no se quiere corromper la configuración que se almacenará en estos directorios.

    Actualización:
    Aunque eclipse compilaba correctamente y parecía funcionar sin problemas, al ejecutar el código dentro de eclipse se producía un error indicando «cannot create pty», es decir, no puede crear la terminal virtual para la salida del programa a ejecutar.

    No he dado con una solución permanente, sólo con una que ejecutada una vez es válida hasta que se vuelva a reiniciar el sistema, ésta consiste en montar el dispositivo manejador de terminales dentro del entorno chroot:

    sudo mount pts /dev/pts -t devpts

    Esto se obtuvo de http://forum.dsmg600.info/viewtopic.php?pid=29501#p29501 y http://xtor.warp.es/?p=49

    ¿Conoce alguien una solución permanente?

    http://ubuntuforums.org/showpost.php?p=119679&postcount=1