2012-05-02 12 views
5

Instalé Ubuntu hace unos días, y utilicé apt-get para instalar build_essentials, opencv, highgui, etc. g ++ es 4.6.1, opencv parece ser 2.1.0 .. No lo hice t build opencv desde la fuente ...Ububtu, opencv y enlace

Tenemos algunos programas que usan la funcionalidad de opencv. Supongamos que los archivos fuente se llaman a.cpp y b.cpp. Recopilo en a.o y b.o y luego los coloco en una biblioteca .so (llámalo libab.so).

Finalmente, hay un archivo con main en él (llámelo z.cpp). Intento crear un ejecutable a partir de él, pero obtengo una tonelada de errores de "referencia indefinida" para cv :: stuff. Mi línea de enlace es como la siguiente:

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

en cuando me siento los errores de referencia (todos los cuales son de CV :: cosas).

La parte interesante es que si enlace directamente con mis archivos .o, se compila muy bien. Así que esto:

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

funciona.

Todo lo que he leído parece implicar que es probable que sea un problema de ordenamiento de líneas de enlace, pero he intentado todas las permutaciones de pedidos y tengo el mismo problema, así que realmente no creo que sea mi problema, pero podría aún estar equivocado Alguien tiene alguna idea de cómo puedo hacer que esto se construya con mi biblioteca, y por qué actuaría de manera diferente si construyo con el conjunto completo de archivos .o que están en la biblioteca con éxito, pero que no puedo compilar con la biblioteca misma.

+0

Ok, así que esto no es Realmente es una "solución", pero terminé instalando Opencv 2.3.1 desde la fuente - también tuve que instalar ffmpeg (¡específicamente v0.8!) y ahora todo funciona. Por lo tanto, claramente tenía algo que ver con la construcción de OpenCV que obtuve con apt-get. No he intentado esto, pero supongo que podría haber instalado 2.1 desde la fuente y también habría funcionado. Todavía no estoy seguro de por qué compilar con la biblioteca vs.o's sería un problema, pero las cosas están funcionando ahora, así que ... – daroo

Respuesta

3

Me parece que está enlazando con las antiguas bibliotecas de C. Los comandos de enlace de OpenCV de hoy serían más como: -lopencv_core -lopencv_flann -lopencv_highgui....

Por lo general, primero establezco un enlace con el módulo central, ya que el orden es importante, luego sigo el orden alfabético (para asegurarme de que no olvido un módulo).

- EDITAR -

¿trató de poner el -Lab después de librerías OpenCV? Esto puede ser el truco, ya que las bibliotecas están vinculadas en el orden de la línea de comando.

+0

¿Son ésas para opencv2.1.0? Sé que lo cambiaron, pero obtuve esas libs de "pkg-config opencv --libs", así que supongo que son las correctas, también se vincula bien cuando enlazo con los archivos .o, así que parece que esos tienen tiene que estar en lo cierto ... Verificará la existencia de libs denominadas de la nueva manera ... – daroo

+0

La versión de producción real es 2.3.x, y 2.4.0 está en versión beta. Ubunutu parece ser bastante tarde en las versiones. De todos modos, por lo que puedo recordar, incluso si se agregaron algunos módulos nuevos a lo largo del tiempo, el libopencv_core, libopencv_highui, libopencv_imgproc ... tenía este patrón de nombre en las versiones 2.x. – sansuiso

+0

Interesante .. No tengo ningún archivo llamado "libopencv *". Los archivos en/usr/lib se llaman "libcv.so.2.1.0" "libcvaux.so.2.1.0" etc. En este punto, me puedo ver forzado a obtener 2.3.x y compilar desde el origen y el se si ayuda. Esto simplemente no parece un problema de opencv, dado que puedo construir bien cuando enlace con los archivos .o de mi fuente en lugar del .so que fue creado desde mi fuente. – daroo

12

puede pasar el siguiente indicador de g ++:

`pkg-config --libs opencv` 

Por ejemplo:

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

pkg-config dan al compilador de la información acerca de la biblioteca para usted.

Usted puede mirar en:

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

Este archivo contiene toda la información relevante para su compilación:

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

Eso es exactamente lo que estaba haciendo, y es por eso que no creo que sea un tema de opencv o nomenclatura de la biblioteca. No lo mostré en mi publicación para mayor claridad, pero como obtuve las librerías directamente de pkg-config, estaba bastante seguro de que estaba usando las correctas. Voy a agregar un comentario a mi pregunta original para la "resolución". – daroo