La vinculación usando g++ falla en la búsqueda de-lstdc++


Estoy tratando de usar el Makefile de otra persona para completar una biblioteca c++ muy simple. El makefile es el siguiente:

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

Esto 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

Para tu información, estoy en Ubuntu 9.10 64bit.

Author: jwoolard, 2010-01-18

3 answers

Publicando para referencia futura, una solución que encontré fue instalar g++-multilib. Tuve el mismo problema incompatible relacionado con-lstdc++ en g++ versión 4.6.1

En un sondeo adicional: g++-multilib es un paquete ficticio que instaló g++4.6-multilib que a su vez instaló el correspondiente libstdc++.so bajo la carpeta /usr/lib/gcc/x86_64-linux-gnu/4.6/32.

 75
Author: Raunaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-10 14:03:44

Respondiendo a mi propia pregunta:

Esta solución parece ser un poco un truco, necesita 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 hecho esto, el enlazador automáticamente encontrará la biblioteca correcta para usar.

 18
Author: jwoolard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-18 13:47:59

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.

Pruebe apt-get install ia32-libs libc6 - i386 libc6-dev - i386 lib32gcc1 lib32stdc++6

(btw. usted está produciendo un .por lo tanto , usted debe especificar-cLPI al compilar su.archivos cpp también)

 4
Author: nos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-18 12:57:10