23 abr 2011

GCC 4.6 error de compilacion / GCC 4.6 compilation error

Bueno, una vez mas!!!, (digo esto porque ya contare otras pavaditas de los dev de ArchLinux), decidieron meter en la rama stable, el gcc 4.6, solo porque trae el extra de compilar con flags para I7, un costo altisimo con lo que produce (Errores), que es NO compilar cosas desde AUR, en muchas ocaciones, cosas complejas con muchos enlaces a otros cpp, como ser, el caso probado, kompozer.
Si bien los usuarios de Arch no poseen en su mayoria I7, y por si fuera poco no saben NI usar los flags, ya que dejan el /etc/makepkg.conf como viene lo mismo los flags de kernel, me parece _estupido_ que hayan pasado algo -tan- importante como el gcc, compilador, para kernel y demas de la rama 4.6 que es altamente inestable, solo porque es cool.... o porque "oh yeah Arch use gcc for I7", si estas pensado eso, si yo lo pense eh!!.
Mas aun si tenemos en cuenta, que como los dev de Arch son pocos, la mayoria de las cosas estan en AUR, asi que... nos han dejado sin software =(.

Arreglemos esto, que ni mi perro haria, pero es otro tema:

pacman -Q |grep gcc

Luego pacman -Rdd a cada paquete de gcc que vean, si usan 64 bit como yo, van a este server: http://arm.konnichi.com/multilib/os/x86_64/

Bajan con wget lo siguiente de http://arm.konnichi.com/core/os/x86_64/

gcc-libs-multilib-4.5.2-6-x86_64.pkg.tar.xz
lib32-gcc-libs-4.5.2-6-x86_64.pkg.tar.xz
gcc-multilib-4.5.2-6-x86_64.pkg.tar.xz
gcc-fortran-multilib-4.5.2-6-x86_64.pkg.tar.xz
gcc-ada-multilib-4.5.2-6-x86_64.pkg.tar.xz
gcc-gcj-ecj-4.5-1-any.pkg.tar.xz
gcc-gcj-4.5.2-1-x86_64.pkg.tar.xz
gcc-objc-multilib-4.5.2-6-x86_64.pkg.tar.xz

Luego instalan en este orden con el comando pacman -U de forma local:



gcc-libs-multilib-4.5.2-6-x86_64.pkg.tar.xz
lib32-gcc-libs-4.5.2-6-x86_64.pkg.tar.xz
gcc-multilib-4.5.2-6-x86_64.pkg.tar.xz
gcc-fortran-multilib-4.5.2-6-x86_64.pkg.tar.xz
gcc-ada-multilib-4.5.2-6-x86_64.pkg.tar.xz
gcc-gcj-ecj-4.5-1-any.pkg.tar.xz
gcc-gcj-4.5.2-1-x86_64.pkg.tar.xz
gcc-objc-multilib-4.5.2-6-x86_64.pkg.tar.xz


Y por ultimo los ponen en blacklist en /etc/pacman.conf asi:

IgnorePkg   = gcc-libs-multilib lib32-gcc-libs gcc-multilib gcc-fortran-multilib gcc-ada-multilib gcc-gcj-ecj gcc-gcj gcc-objc-multilib



Listo, resuelto el problema, porque multilib?, porque con el gcc de multilib pueden compilar para 64 nativos o 32 bits, con el parametro:

gcc -m32 foo.c

Y tendran un binario de 32 bit.


Opcion2, pero mas rebuscada, no me gusta pero es lo "correcto"

Resulta que en GCC 4.6 mucho codigo viejo no sera compilado en lo que sea C++ usando g++, esto es porque posee un mecanismo altamente, si, muy altamente restrictivo en cuanto al codigo, si este no esta 110% ok, no compila, por tanto, podemos agregar a makepkg.conf o make.conf o en export CXXFLAGS y CFLAGS =-fpermissive, con eso si compilara lo que solia compilar el 4.5.2


Chequeando todo:

nano foo.c y pegan dentro:


#include <stdio.h>

 main()
 {
     printf("hello world!\n");
 }

luego gcc foo.c -o foo y luego ldd foo les tiene que dar algo asi:

ldd test
        linux-vdso.so.1 =>  (0x00007fff7d7ff000)
        libc.so.6 => /lib/libc.so.6 (0x00007f0a16ddc000)
        /lib/ld-linux-x86-64.so.2 (0x00007f0a1713a000)

No hay comentarios: