
저는 게임을 작성 중인데 최근 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비트입니다. 젠투 상자에는 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" }