2010-01-18 12 views
22

Sto provando a usare il Makefile di qualcun altro per completare una libreria C++ molto semplice. Il makefile è la seguente:Il collegamento usando g ++ non riesce a cercare -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 

Questo compila bene, ma il linker si lamenta:

... 
/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, io sono su Ubuntu 9.10 64bit.

+0

Quale versione di g ++ stai usando - fai 'g ++ --version' per scoprirlo. –

+0

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

risposta

72

Pubblicando per riferimento futuro, una soluzione che ho trovato era installare g ++ - multilib. Ho avuto lo stesso problema incompatibile relativa ad -lstdC++ su g ++ versione 4.6.1

In ulteriori tastatura: g ++ - multilib è un pacchetto vuoto che installato g ++ 4.6 multilib che a sua volta installato l'appropriato libstdC++ così. sotto la cartella /usr/lib/gcc/x86_64-linux-gnu/4.6/32.

+10

Onestamente! Questo merita più di un singolo voto. Risolto il mio problema, di sicuro. – zeboidlund

+1

Questo approccio è consigliato anche da https://bugs.launchpad.net/ubuntu/+source/gcc-4.6/+bug/973240 – Gili

+0

Questo ha risolto il mio problema nella creazione di una versione a 32 bit di NodeJS su Ubuntu 12.04.1 LTS – ShaneH

4

Sembra che si stia compilando una libreria a 32 bit su una macchina a 64 bit, tuttavia una versione a 32 bit di libstdC++ non è presente.

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

(btw. Si sta producendo un .so, è necessario specificare -fPIC durante la compilazione tuo cpp file così)

+1

Ci avevo pensato, comunque sono tutti installati - grazie per il promemoria -fPIC, avrei dovuto capirlo ... – jwoolard

18

Rispondendo alla mia domanda:

soluzione Ths sembra essere un po 'di hack, è necessario creare un link simbolico per la versione a 32 bit della libreria (dopo l'installazione dei pacchetti citati in @ la risposta di nos):

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

Una volta fatto, il linker troverà automaticamente la libreria corretta da utilizzare.

+0

@ nos Link è morto. –

+0

Probabilmente correlato a questo bug: https://bugs.launchpad.net/ubuntu/+source/ia32-libs/+bug/360870 (nuovo collegamento) – nos

Problemi correlati