web-dev-qa-db-ja.com

g ++を使用したリンクが-lstdc ++の検索に失敗する

私は他の誰かの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 64ビットを使用しています。

25
jwoolard

将来の参考のために投稿したところ、私が見つけた解決策はinstall g ++-multilibでした。 g ++バージョン4.6.1の-lstdc ++に関連する同じ非互換性の問題がありました

さらに詳しく調べると、g ++-multilibはg ++ 4.6-multilibをインストールしたダミーパッケージであり、適切なlibstdc ++。soを/ usr/lib/gcc/x86_64-linux-gnu /にインストールしました4.6/32フォルダ。

77
Raunaq

私自身の質問に答える:

このソリューションは少しハックのようです、(@ nosの回答で言及されているパッケージをインストールした後)ライブラリの32ビットバージョンのシンボリックリンクを作成する必要があります:

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

これを完了すると、リンカーは使用する正しいライブラリを自動的に見つけます。

18
jwoolard

64ビットマシンで32ビットライブラリをコンパイルしているようですが、32ビットバージョンのlibstdc ++がありません。

Apt-get install ia32-libs libc6-i386 libc6-dev-i386 lib32gcc1 lib32stdc ++ 6を試してください

(ところで、.soを作成しているので、.cppファイルもコンパイルするときに-fPICを指定する必要があります)

5
nos