Vinculando problemas com libjpeg

2

Eu tenho um jogo que estou escrevendo que recentemente exigiu o libjpeg. Eu escrevi algum código usando libjpeg em outra máquina e funcionou como esperado. Eu puxei o código para esta máquina e tentei compilá-lo e executá-lo e obtive o erro de execução do libjpeg:

Wrong JPEG library version: library is 62, caller expects 80

Se eu usar o ldd para ver como o binário está vinculado, recebo:

ldd Debug/tc | grep jpeg libjpeg.so.62 => /usr/lib/x86_64-linux-gnu/libjpeg.so.62 (0x00007f50f02f2000)

Meus sinalizadores de compilação incluem -ljpeg. Os objetos compartilhados relacionados ao jpeg atual em meu / usr / lib são assim:

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

A máquina original roda o Gentoo, a máquina 'this' roda o Ubuntu 11.10. Ambos são de 64 bits. A caixa do gentoo só tem a versão 8 da libjpeg.

Por fim, minha pergunta é: Como posso resolver isso? Eu também gostaria de saber como posso determinar exatamente qual biblioteca o linker usou.

EDIT: Meu jogo também se conecta ao SDL_image, que, de acordo com o ldd, vincula à versão 8 do libjpeg. Aposto que é de onde meus problemas se originam. Como posso dizer ao gcc para vincular meu jogo à versão 8 do libjpeg? Eu tentei -l / usr / lib / libjpeg.so.whatever e ele reclamou sobre não encontrar o lib especificado.

    
por notlesh 30.11.2011 / 10:33

2 respostas

2

Por favor use LD_LIBRARY_PATH. Consulte também estes links úteis:

link

link

    
por 30.11.2011 / 10:37
0

O link a seguir resolveu o problema para mim. Como você vincula para uma versão específica de uma biblioteca compartilhada no GCC

Trecho do link que me ajudou -

Em vez de usar "-lcurl" use "-l: libcurl.so.3" E claro, use também "-L _installed_path _"

Meu erro foi o inverso "Versão da biblioteca JPEG errada: a biblioteca é 80, o chamador espera 62"

Para descobrir em qual biblioteca jpeg meu binário estava vinculado, eu fiz -

ldd my_binary | grep jpeg

a saída foi -

libjpeg.so.8 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libjpeg.so.8

Claramente, o binário estava dependendo da libjpeg8 (biblioteca 80), e foi por isso que eu estava recebendo o erro.

Para descobrir se eu realmente tinha libjpeg62 no meu sistema, eu fiz

ldconfig -p | grep jpeg

a saída foi -

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

Então, no meu caso, ao invés de apenas usar -ljpeg, eu usei isso (no arquivo make) -

-L/usr/lib/x86_64-linux-gnu/ -l:libjpeg.so.62

Não se esqueça de substituir #include (jpeglib.h > no seu arquivo cpp com

extern "C" {
#include "jpeglib.h" }

Espero que ajude!

    
por 19.11.2014 / 21:36