私はゲームを書いていますが、最近libjpegが必要でした。私は別のコンピュータでlibjpegを使っていくつかのコードを書いていましたが、期待どおりに動作します。このコンピュータにコードをインポートしてコンパイルして実行しようとしましたが、libjpegでランタイムエラーが発生しました。
Wrong JPEG library version: library is 62, caller expects 80
バイナリが何に接続されているかを確認するためにlddを使用すると、次のような結果が得られます。
ldd Debug/tc | grep jpeg
libjpeg.so.62 => /usr/lib/x86_64-linux-gnu/libjpeg.so.62 (0x00007f50f02f2000)
私のコンパイルフラグには-ljpegが含まれています。私の/usr/libにある現在のjpeg関連の共有オブジェクトは次のとおりです。
find | grep jpeg | xargs ls -l --color
-rwxr-xr-x 1 root root 61256 2011-09-26 15:43 ./gimp/2.0/plug-ins/file-jpeg
-rw-r--r-- 1 root root 5912 2011-10-01 06:40 ./grub/i386-pc/jpeg.mod
-rw-r--r-- 1 root root 40264 2011-08-24 05:41 ./gstreamer-0.10/libgstjpegformat.so
-rw-r--r-- 1 root root 78064 2011-08-24 05:41 ./gstreamer-0.10/libgstjpeg.so
-rw-r--r-- 1 root root 17920 2011-09-27 17:30 ./i386-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-jpeg.so
lrwxrwxrwx 1 root root 17 2011-08-10 14:07 ./i386-linux-gnu/libjpeg.so.62 -> libjpeg.so.62.0.0
-rw-r--r-- 1 root root 145068 2011-08-10 14:07 ./i386-linux-gnu/libjpeg.so.62.0.0
-rw-r--r-- 1 root root 30440 2011-09-30 05:25 ./i386-linux-gnu/qt4/plugins/imageformats/libqjpeg.so
-rw-r--r-- 1 root root 924 2011-06-15 05:05 ./ImageMagick-6.6.0/modules-Q16/coders/jpeg.la
-rw-r--r-- 1 root root 39504 2011-06-15 05:05 ./ImageMagick-6.6.0/modules-Q16/coders/jpeg.so
-rw-r--r-- 1 root root 10312 2011-06-03 00:18 ./imlib2/loaders/jpeg.so
-rw-r--r-- 1 root root 43072 2011-10-21 19:11 ./jvm/java-6-openjdk/jre/lib/amd64/libjpeg.so
-rw-r--r-- 1 root root 23184 2011-10-14 02:46 ./kde4/jpegthumbnail.so
-rw-r--r-- 1 root root 132632 2009-04-30 00:24 ./libopenjpeg-2.1.3.0.so
lrwxrwxrwx 1 root root 22 2009-04-30 00:24 ./libopenjpeg.so.2 -> libopenjpeg-2.1.3.0.so
-rw-r--r-- 1 root root 23224 2011-08-03 04:20 ./libquicktime2/lqt_mjpeg.so
-rw-r--r-- 1 root root 27208 2011-08-03 04:20 ./libquicktime2/lqt_rtjpeg.so
-rw-r--r-- 1 root root 47800 2011-09-24 10:12 ./strigi/strigiea_jpeg.so
-rw-r--r-- 1 root root 3091 2011-05-18 05:25 ./syslinux/com32/include/tinyjpeg.h
-rw-r--r-- 1 root root 22912 2011-09-27 17:38 ./x86_64-linux-gnu/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-jpeg.so
-rw-r--r-- 1 root root 226798 2011-08-10 14:06 ./x86_64-linux-gnu/libjpeg.a
-rw-r--r-- 1 root root 935 2011-08-10 14:06 ./x86_64-linux-gnu/libjpeg.la
lrwxrwxrwx 1 root root 17 2011-08-10 14:06 ./x86_64-linux-gnu/libjpeg.so -> libjpeg.so.62.0.0
lrwxrwxrwx 1 root root 17 2011-10-15 10:50 ./x86_64-linux-gnu/libjpeg.so.62 -> libjpeg.so.62.0.0
-rw-r--r-- 1 root root 150144 2011-08-10 14:06 ./x86_64-linux-gnu/libjpeg.so.62.0.0
lrwxrwxrwx 1 root root 16 2011-10-15 10:50 ./x86_64-linux-gnu/libjpeg.so.8 -> libjpeg.so.8.3.0
lrwxrwxrwx 1 root root 19 2011-11-30 01:25 ./x86_64-linux-gnu/libjpeg.so.8.3.0.bak -> ./libjpeg.so.62.0.0
-rw-r--r-- 1 root root 31488 2011-09-30 05:13 ./x86_64-linux-gnu/qt4/plugins/imageformats/libqjpeg.so
元のコンピュータはGentooを実行し、「この」コンピュータはUbuntu 11.10を実行します。どちらも64ビットです。 Gentooボックスにはlibjpegバージョン8のみがあるようです。
最終的に私の質問は次のとおりです。この問題をどのように解決できますか?また、リンカーが使用するライブラリを正確に確認する方法も知りたいです。
編集:私のゲームはlibjpegバージョン8へのlddリンクに従ってSDL_imageにもリンクされています。私はそれが私の問題の源であると確信しています。私のゲームをlibjpegバージョン8に接続するようにgccにどのように指示しますか? -l/usr/lib/libjpeg.so.whateverを試しましたが、指定されたライブラリが見つからないと文句を言いました。
答え1
LD_LIBRARY_PATHを使用してください。次の便利なリンクも参照してください。
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
答え2
次のリンクは私のためにこの問題を解決しました。GCCで特定のバージョンの共有ライブラリに接続する方法
私に役立つリンクから抜粋 -
「-lcurl」の代わりに「-l:libcurl.so.3」を使用し、もちろん「-L _installed_path_」を使用します。
私のエラーは反対でした。 "無効なJPEGライブラリのバージョン:ライブラリは80で、呼び出し元は62を期待しています。"
私のバイナリがどのJPEGライブラリにリンクされているかを確認するには、次のようにしました。
ldd my_binary | grep jpeg
出力は -
libjpeg.so.8 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so.8
明らかに、このバイナリはlibjpeg8(ライブラリ80)に依存しているため、エラーが発生します。
私のシステムに実際にlibjpeg62があるかどうかを確認するには、次のようにしました。
ldconfig -p | grep jpeg
出力は -
libplayerjpeg.so.3.0 (libc6,x86-64) => /usr/lib/libplayerjpeg.so.3.0
libopenjpeg.so.2 (libc6,x86-64) => /usr/lib/libopenjpeg.so.2
libjpeg.so.62 (libc6,x86-64) => /usr/local/lib/libjpeg.so.62
libjpeg.so.62 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so.62
libjpeg.so.8 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so.8
libjpeg.so.8 (libc6) => /usr/lib/i386-linux-gnu/libjpeg.so.8
libjpeg.so (libc6,x86-64) => /usr/local/lib/libjpeg.so
libjpeg.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so
だから私の場合は、-ljpegを使用する代わりに、次のものを使用しました(makeファイルから)。
-L/usr/lib/x86_64-linux-gnu/ -l:libjpeg.so.62
交換することを忘れないでください#include(jpeglib.h>あなたのcppファイルに
extern "C" {
#include "jpeglib.h" }