0

Linuxボックスで小さなc++プロジェクトを作成しました。-Iおよび_L、-lコマンドを使用して、コードを適切にコンパイルおよびリンクできます。

コードの実行中に、LD_LIBRARY_PATH変数に.soファイルへのパスが必要であることをネットで読みました。現在使用しているボックスは64ビットで、32ビットバージョンのライブラリを使用する別のアプリケーションがあります。したがって、LD_LIBRARY_PATHには、ライブラリの両方のバージョンへのパスがあります。

アプリケーションを実行しようとしたとき。./xyz arg1 arg2、次のエラーが発生します

./DaemonCpp: error while loading shared libraries: libldap.so: wrong ELF class: ELFCLASS32

これは、64ビットバージョンではなく32ビットバージョンを読み込もうとしているためだと思います。LD_LIBRARY_PATHにパスが記載されている順序を変更して、64ビットへのパスが最初になるようにしましたが、それでもこのエラーが発生します。ライブラリの64ビットバージョンを使用するようにアプリに指示する方法はありますか?

私の主な問題の2番目の質問として、c ++コードをリンクするときは、-Lを使用してライブラリパスを指定し、-lを使用してライブラリ名を指定します。そうすれば、実行可能ファイルを実行するときに使用するライブラリがわかっているはずであり、そもそもこのエラーが発生することはないはずです。

4

1 に答える 1

1

2番目の質問への回答では-L、リンクタイムパスを指定するためにのみ使用しました。-rpath=<path>また、で指定するパスごとに追加する必要があります-L。実行時も確認できるようにします。

リンクにgcc/g ++ドライバーを使用している場合は、-Wl,-rpath=<path>

例:ライブラリlibfoo.so in /opt/libs/lib64

gcc -o test test.o -L/opt/libs/lib64 -Wl,-rpath=/opt/libs/lib64 -lfoo

最初の質問に答えて、LD_LIBRARY_PATH問題が発生している場合、最初の呼び出しポートはldd、実行時にリンクされているライブラリへのパスを示します。空の文字列から始めて、そこから作業を進めていきます。

第三に、LD_LIBRARY_PATH設定する必要がある理由が/ opt / libなどにライブラリがあるためである場合は、これらのパスをに追加し、これらのライブラリの検索マップを更新するために/etc/ld.so.conf使用する必要があります。これにより、通常、変数がまったくldconfig必要なくなります。LD_LIBRARY_PATH

于 2012-08-30T07:18:55.280 に答える