web-dev-qa-db-fra.com

La liaison à l'aide de g ++ échoue lors de la recherche de -lstdc ++

J'essaie d'utiliser le Makefile de quelqu'un d'autre pour compiler une bibliothèque c ++ très simple. Le makefile est le suivant:

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

Cela compile bien, mais l'éditeur de liens se plaint:

...
/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

Pour info, je suis sur Ubuntu 9.10 64bit.

25
jwoolard

Posant pour référence future, une solution que j'ai trouvée était de installer g ++ - multilib. J'ai eu le même problème incompatible avec -lstdc ++ sur g ++ version 4.6.1

En approfondissant le sujet: g ++ - multilib est un paquet factice qui a installé g ++ 4.6-multilib qui à son tour a installé le bon libstdc ++. So sous/usr/lib/gcc/x86_64-linux-gnu/Dossier 4.6/32.

77
Raunaq

Répondre à ma propre question:

Cette solution semble être un peu un hack, vous devez créer un lien symbolique pour la version 32 bits de la bibliothèque (après avoir installé les packages mentionnés dans la réponse de @ nos):

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

Une fois que vous avez fait cela, l'éditeur de liens trouvera automatiquement la bonne bibliothèque à utiliser.

18
jwoolard

Il semble que vous compiliez une bibliothèque 32 bits sur une machine 64 bits, mais aucune version 32 bits de libstdc ++ n'est présente.

Essayez l'installation apt-get ia32-libs libc6-i386 libc6-dev-i386 lib32gcc1 lib32stdc ++ 6

(btw. vous produisez un .so, vous devez également spécifier -fPIC lors de la compilation de vos fichiers .cpp)

5
nos