2015-03-26 32 views
10

Problema

Sto compilando la biblioteca apprendimento profondo Caffe in Ubuntu 14.04 (64 bit).errore `libopencv_highgui.so` Linking sotto Ubuntu 14.04, strano risultato con` libtiff.so.5`

OpenCV (Version: 2.4.8+dfsg1-2ubuntu1) viene installato dal server di pacchetti di Ubuntu con:

sudo apt-get install libopencv-dev

Compile Caffe con CMake 2.8.

errore durante il collegamento:

Linking CXX executable caffe-

/usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4.8: undefined reference to `[email protected]_4.0'

Infomation

Sembra che alcuni simboli della libreria TIFF non sono state trovate. Ho fatto qualche sforzo per trovare il motivo (senza fortuna). Ecco alcune informazioni sulle librerie.

libreria TIFF collegato da libopencv_highgui.so.2.4.8

$ ldd libopencv_highgui.so.2.4.8 | grep tiff

libtiff.so.5 => /usr/lib/x86_64-linux-gnu/libtiff.so.5 (0x00007f978313b000)

simboli importazione di libopencv_highgui.so.2.4.8

$ readelf -s libopencv_highgui.so.2.4.8 |grep TIFFOpen

62: 0000000000000000 0 FUNC GLOBAL DEFAULT UND [email protected]_4.0 (9)

Nota: C'è una sola @ nei nomi dei simboli.

$ nm -D libopencv_highgui.so.2.4.8| grep TIFFOpen

U TIFFOpen

simboli esportazione di libtiff.so.5:

$ nm -D /usr/lib/x86_64-linux-gnu/libtiff.so.5

0000000000000000 A LIBTIFF_4.0

...

00000000000429f0 T TIFFOpen

...

$ readelf -s /usr/lib/x86_64-linux-gnu/libtiff.so.5|grep TIFFOpen

99: 00000000000429f0 239 FUNC GLOBAL DEFAULT 12 [email protected]@LIBTIFF_4.0

Nota: Ci sono due @ (@@) nei nomi dei simboli.

La mia confusione

  1. È perché libtiff.so.5 ha @@ nei nomi dei simboli invece di @ che hanno fatto l'errore di collegamento

    libopencv_highgui.so.2.4.8: undefined reference to '[email protected]_4.0'

  2. What's the difference between @ and @@ in symbol names?
  3. What's the meaning of the suffix LIBTIFF_4.0 of symbols names in libtiff.so.5 ?
  4. Many people said it's because OpenCV need libtiff4-dev which is not provided by Ubuntu 14.04. Then why the Ubuntu guys put a broken package on the package server.
  5. How to solve the linking problem?


Io non sono una professione sulla compilazione e linking. Ci scusiamo per un post così lungo. Che cosa fornire abbastanza informazioni per voi ragazzi per aiutarmi. Apprezzo per qualsiasi suggerimento.

P.S. Se hai bisogno di maggiori informazioni su queste librerie, sentiti libero di dire nel commento.

+0

Troppo lungo, puoi rendere il tuo post conciso? –

+0

Ora è più conciso. @Golazo – nn0p

+0

Hai finito per risolvere questo problema? In tal caso, potresti descrivere la soluzione. Grazie! – Josh

risposta

1

Installare libtiff4-dev:

sudo apt-get install libtiff4-dev

+1

In realtà, ho provato a installare la versione 4. Ma questo non risolve il problema. La libreria che 'libopencv_highgui.so.2.4.8' cercherebbe è' libtiff.so.5'. A proposito, Ubuntu 14.04 non fornisce libtiff4. [libtiff4-dev files] (http://packages.ubuntu.com/trusty/amd64/libtiff4-dev/filelist). A meno che non compili OpenCV per me stesso. – nn0p

1

Questo è ciò che ha funzionato per me: Vai a Tiff website, e seguire le istruzioni per scaricare Tiff e costruirlo, e installarlo.Poi, nel tuo make file aggiungere questo:

-L/[path to libtiff.so] -ltiff 

Se volete sapere il percorso del libtiff.so provare questo:

sudo find /usr/ -name libtiff.so 
1

vecchia questione, ma ancora senza una risposta così qui va (Ho riscontrato lo stesso errore oggi):

  1. Non è questo il motivo per cui il linker non funziona. Se fosse in grado di trovare libtiff.so.5, sarebbe stato collegato correttamente.

  2. @ vs @@ è solo un modo per tenere traccia delle diverse versioni della funzione. Maggiori dettagli qui https://sourceware.org/binutils/docs/ld/VERSION.html

  3. LIBTIFF_4.0 indica che è la specifica versione di TIFFOpen necessaria quando si carica dinamicamente il simbolo.

  4. Questo è probabilmente un buon modo per risolvere il problema. È probabile che senza il pacchetto libtiff-dev il file link simbolico libtiff.so non esca in/usr/lib/x86_64-linux-gnu/così il linker non sarà in grado di trovare la libreria (non sa nulla di libtiff. so.5 a meno che non lo dica esplicitamente).

  5. a. Potresti riuscire a provare 4. richiamando la riga di comando del linker tu stesso dalla riga di comando. Se hai compilato caffe con cmake, troverai il comando linker sotto tools/CMakeFiles/caffe.bin.dir/link.txt. Basta aggiungere /usr/lib/x86_64-linux-gnu/libtiff.so.5 alla riga di comando e dovrebbe funzionare.

    b. In alternativa, creare manualmente il collegamento simbolico /usr/lib/x86_64-linux-gnu/libtiff.so

    c. installa il pacchetto dev, che dovrebbe farlo per te. Assicuratevi inoltre che cmake conosca/usr/lib/x86_64-linux-gnu/specificando il percorso della libreria supplementare

    d. controllare che non ci sono altre biblioteca libtiff.so agguato nel vostro sistema se passaggi precedenti non funzionano (per esempio anconda cosa tipo)

Speranza che aiuta.

1

ho avuto problemi la classica ed è stato a causa di Anaconda incasinare

ho dovuto semplicemente ad eseguire il seguente comando:

conda remove libtiff 

ho installato opecv via:

sudo apt-get install opencv-dev 

e libtiff via:

sudo apt-get install libtiff4-dev 
0

Come si può vedere nel

62: 0000000000000000 0 FUNC GLOBAL DEFAULT UND [email protected]_4.0 (9) 

c'è un UND che credo mezzi undefined. Credo che quando Ubuntu sta producendo libopencv_highgui, non riesce a trovare [email protected] 4.0. Quindi penso che dovrei avere libtiff a portata di mano e compilare di nuovo libopencv_xxx.

Mi piace includere le cose in corso. Quindi installo di nuovo opencv con conda e punto il mio LIBRARY_PATH nella directory lib di conda e le cose vanno bene.