28

他の誰かの Makefile を使用して、非常に単純な C++ ライブラリをコンパイルしようとしています。メイクファイルは次のとおりです。

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 ビットを使用しています。

4

3 に答える 3

82

将来の参考のために投稿すると、私が見つけた解決策は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 フォルダーにインストールされています。

于 2011-12-10T14:03:44.840 に答える
19

私自身の質問に答える:

この解決策はちょっとしたハックのようです。32ビットバージョンのライブラリのシンボリックリンクを作成する必要があります(@nosの回答に記載されているパッケージをインストールした後)。

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

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

于 2010-01-18T13:47:59.813 に答える
5

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

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

(ところで、あなたは .so を生成しています。同様に .cpp ファイルをコンパイルするときに -fPIC を指定する必要があります)

于 2010-01-18T12:57:10.103 に答える