2012-05-02 14 views
5

Ho installato Ubuntu alcuni giorni fa e ho usato apt-get per installare build_essentials, opencv, highgui, ecc. G ++ è 4.6.1, opencv sembra essere 2.1.0 .. Non l'ho fatto t costruire opencv dalla fonte ..Ububtu, opencv e linking

Abbiamo alcuni software che utilizza la funzionalità opencv. Supponiamo che i file di origine siano denominati a.cpp e b.cpp. Compilano a.o e b.o e poi li inserisco in una libreria .so (chiamiamola libab.so).

Infine, c'è un file con il main (chiamalo z.cpp). Provo a creare un eseguibile da esso, ma ottengo un sacco di errori di "riferimento non definito" a cv :: stuff. La mia linea di collegamento simile a questa:

g++ -fPIC -g z.cpp -L../lib -lab -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out 

tanto sono gli errori di riferimento non definiti (che sono tutti al cv :: roba).

La parte interessante è che se collego direttamente con i miei file .o, si costruisce bene. Quindi:

g++ -fPIC -g z.cpp a.o b.o -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out 

opere.

Tutto ciò che ho letto sembra implicare che questo è probabilmente un problema di ordinamento della linea di collegamento, ma ho provato tutte le permutazioni di ordinamento e ottenere lo stesso problema, quindi non penso davvero che sia il mio problema, ma potrei essere ancora sbagliato Qualcuno ha qualche idea su come posso farlo costruire con la mia libreria, e perché agirebbe diversamente se costruisco con il set completo di file .o che sono nella libreria con successo, ma non riesco a costruire con la libreria stessa?

+0

Ok, quindi questo isn è davvero una "soluzione", ma alla fine ho installato opencv 2.3.1 dal sorgente - ho dovuto anche installare ffmpeg (v0.8 in particolare!) e ora tutto funziona. Quindi, chiaramente aveva qualcosa a che fare con la build di opencv che ho ottenuto con apt-get. Non ho provato questo, ma suppongo che avrei potuto installare 2.1 dal sorgente e avrebbe funzionato anche. Ancora non sono sicuro del motivo per cui la compilazione con la libreria vs il.o sarebbe un problema, ma le cose stanno funzionando ora, quindi .... – daroo

risposta

3

Mi sembra che tu stia collegando con le vecchie librerie C. I comandi di collegamento OpenCV di oggi sono più simili a: -lopencv_core -lopencv_flann -lopencv_highgui....

Solitamente mi collego con il modulo principale, poiché l'ordine conta, quindi seguo l'ordine alfabetico (per essere sicuro di non dimenticare un modulo).

- EDIT -

Hai provato a mettere il -lab dopo librerie OpenCV? Questo può fare il trucco, dal momento che le librerie sono collegate nell'ordine della riga di comando.

+0

Sono quelle per opencv2.1.0? So che l'hanno cambiato, ma ho ricevuto queste librerie da "pkg-config opencv --libs" quindi presumo che siano quelle giuste - inoltre si collega bene quando collego con i file .o, quindi sembra che quelli che hanno devo avere ragione ... controllerò l'esistenza di librerie chiamate il nuovo modo .. – daroo

+0

L'attuale versione di produzione è 2.3.xe 2.4.0 è in beta. Ubunutu sembra essere piuttosto in ritardo sulle versioni. Ad ogni modo, per quanto posso ricordare, anche se alcuni nuovi moduli sono stati aggiunti nel tempo, il libopencv_core, libopencv_highui, libopencv_imgproc ... aveva questo schema di nomi nelle versioni 2.x. – sansuiso

+0

Interessante .. Non ho alcun file chiamato "libopencv *". I file in/usr/lib sono denominati "libcv.so.2.1.0" "libcvaux.so.2.1.0" ecc. A questo punto, potrei essere costretto a ottenere 2.3.x e compilare da source e se se aiuta. Questo però non sembra un problema di tipo opencv, dato che posso costruire bene quando collego i file .o dalla mia fonte piuttosto che il .so che è stato creato dalla mia fonte .. – daroo

12

è possibile passare il seguente bandiera per g ++:

`pkg-config --libs opencv` 

Ad esempio:

g++ myprogram.cpp `pkg-config --libs opencv` -o myprogram 

pkg-config dare al compilatore le informazioni sulla libreria per voi.

Potete guardare:

/usr/local/lib/pkgconfig/opencv.pc

Questo file contiene tutte le informazioni rilevanti per la compilazione:

prefix=/usr/local 
exec_prefix=${prefix} 
libdir=${exec_prefix}/lib 
includedir_old=${prefix}/include/opencv 
includedir_new=${prefix}/include 

Name: OpenCV 
Description: Open Source Computer Vision Library 
Version: 2.3.1 
Libs: -L${libdir} -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann 
Cflags: -I${includedir_old} -I${includedir_new} 
+1

Questo è esattamente quello che stavo facendo, motivo per cui non penso che sia stato un problema di denominazione di libreria o opencv. Non l'ho mostrato nel mio post per chiarezza, ma dal momento che ho ottenuto le librerie direttamente da pkg-config, ero abbastanza sicuro che stavo usando quelle corrette. Aggiungerò un commento alla mia domanda originale per la "risoluzione" .. – daroo