При связывании с использованием g ++ не удается найти -lstdc ++ - PullRequest
24 голосов
/ 18 января 2010

Я пытаюсь использовать чужой Makefile для компиляции очень простой библиотеки c ++. Makefile выглядит следующим образом:

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

Это компилируется нормально, но компоновщик жалуется:

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

К вашему сведению, я нахожусь на Ubuntu 9.10 64bit.

Ответы [ 3 ]

76 голосов
/ 10 декабря 2011

Отправляя для дальнейшего использования, я нашел решение: установить g ++ - multilib . У меня была такая же несовместимая проблема, связанная с -lstdc ++ на g ++ версии 4.6.1

При дальнейшем исследовании: g ++ - multilib - это фиктивный пакет, который установил g ++ 4.6-multilib, который, в свою очередь, установил соответствующий libstdc ++. So в / usr / lib / gcc / x86_64-linux- папка gnu / 4.6 / 32.

18 голосов
/ 18 января 2010

Отвечая на мой вопрос:

Это решение кажется хакером, вам нужно создать символическую ссылку для 32-битной версии библиотеки (после установки пакетов, упомянутых в ответе @ nos):

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

Как только вы это сделаете, компоновщик автоматически найдет нужную библиотеку для использования.

5 голосов
/ 18 января 2010

Кажется, вы компилируете 32-битную библиотеку на 64-битной машине, однако 32-битная версия libstdc ++ отсутствует.

Попробуйте apt-get install ia32-libs libc6-i386 libc6-dev-i386 lib32gcc1 lib32stdc ++ 6

(кстати, вы создаете .so, вы также должны указать -fPIC при компиляции ваших файлов .cpp)

...