libjpeg 관련 문제 연결

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비트입니다. 젠투 상자에는 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

http://linuxmafia.com/faq/Admin/ld-lib-path.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" }

관련 정보