2010-01-18 8 views
22

Estoy tratando de usar el Makefile de otra persona para complementar una biblioteca de C++ muy simple. El makefile es el siguiente:Vinculación con g ++ falla al buscar -lstdC++

JNIFLAGS=-O2 -pthread -I/usr/lib/jvm/java-6-sun/include -I/usr/lib/jvm/java-6-sun/include/linux 

all: 
    rm -f ../dist/libUtils.so 
    g++ $(JNIFLAGS) -c -m32 -o com_markets_utils_dates_NativeTime.o com_markets_utils_dates_NativeTime.cpp 
    g++ $(JNIFLAGS) -c -m32 -o DateUtil.o DateUtil.cpp 
    g++ -pthread -m32 -shared -fPIC -o ../dist/libUtils.so DateUtil.cpp 
    g++ -pthread -m32 -shared -fPIC -o ../dist/libNativeTime.so DateUtil.o com_markets_utils_dates_NativeTime.o 

Este compila bien, pero el enlazador se queja:

... 
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.so when searching for -lstdc++ 
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.a when searching for -lstdc++ 
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.so when searching for -lstdc++ 
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.1/libstdc++.a when searching for -lstdc++ 
/usr/bin/ld: cannot find -lstdc++ 
collect2: ld returned 1 exit status 
make: *** [all] Error 1 

FYI, estoy en Ubuntu 9.10 64 bits.

+0

Qué versión de g ++ estás usando - haz 'g ++ --version' para averiguarlo. –

+0

$ g ++ --version g ++ (Ubuntu 4.4.1-4ubuntu8) 4.4.1 – jwoolard

Respuesta

72

Publicando para referencia futura, una solución que encontré fue instalar g ++ - multilib. Que tenía el mismo problema incompatible relativa a -lstdC++ en g ++ versión 4.6.1

En más de sondeo: g ++ - multilib es un paquete ficticio que instaló g ++ 4,6-multilib que a su vez instalado el apropiado libstdC++ así. en la carpeta /usr/lib/gcc/x86_64-linux-gnu/4.6/32.

+10

Honestamente! Esto merece más que un voto único. Resolvió mi problema, seguro. – zeboidlund

+1

Este enfoque también es recomendado por https://bugs.launchpad.net/ubuntu/+source/gcc-4.6/+bug/973240 – Gili

+0

Esto resolvió mi problema al compilar una versión de 32 bits de NodeJS en Ubuntu 12.04.1 LTS – ShaneH

4

Parece que está compilando una biblioteca de 32 bits en una máquina de 64 bits, sin embargo, una versión de 32 bits de libstdC++ no está presente.

Trate apt-get install ia32-libs lib32gcc1 libc6-dev libc6-i386-i386 lib32stdC++ 6

(por cierto. Que está produciendo un .so, debe especificar -fPIC al compilar su .cpp archivos también)

+1

Había pensado en eso, sin embargo, todos están instalados - por cierto, gracias por el recordatorio -fPIC, debería haber cogido eso ... – jwoolard

18

responder a mi propia pregunta:

solución THS parece ser un poco de un truco, es necesario crear un enlace simbólico para la versión de 32 bits de la biblioteca (después de instalar los paquetes mencionados en @ la respuesta de nos):

$ sudo ln -s /usr/lib32/libstdc++.so.6 /usr/lib32/libstdc++.so 

Una vez que haya hecho esto, el enlazador encontrará automáticamente la biblioteca correcta para usar.

+0

@ nos Link está muerto. –

+0

Probablemente relacionado con esta falla: https://bugs.launchpad.net/ubuntu/+source/ia32-libs/+bug/360870 (nuevo enlace) – nos

Cuestiones relacionadas