使用 libjpeg 連結問題
我有一個我正在編寫的遊戲,它最近需要 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。
最終,我的問題是:**我該如何解決這個問題?**我還想知道如何確定連結器使用了哪個庫。
編輯:我的遊戲還連結到 SDL_image,根據 ldd,連結到 libjpeg 版本 8。我敢打賭這就是我的麻煩所在。如何告訴 gcc 將我的遊戲連結到 libjpeg 版本 8?我嘗試了 -l/usr/lib/libjpeg.so.whatever,它抱怨找不到指定的庫。
請使用 LD_LIBRARY_PATH。也請參考這些有用的連結:
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
以下連結為我解決了這個問題。如何連結到 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
不要忘記將cpp 文件中的**#include (jpeglib.h>替換為**
extern "C" { #include "jpeglib.h" }