CMake nicht finden, OpenCV-Bibliotheken
Ähnlich wie diese Frage, ich habe Probleme mit OpenCV und CMake auf OS X 10.10.3.
Nach viel Mühe habe ich es endlich geschafft zu bauen, die OpenCV 3.0 beta auf mein system; die Header wohne jetzt in /usr/local/include
und die libs – wie Sie sollten – sind in /usr/local/lib
. Ich habe kleine Programme, die Sie verwenden OpenCV, meine CMakeLists.txt
sieht wie folgt aus
set( CMAKE_CXX_FLAGS "-O3 -w" )
find_package( OpenCV REQUIRED )
if(OpenCV_FOUND)
message("Found OpenCV")
message("Includes: " ${OpenCV_INCLUDE_DIRS})
endif(OpenCV_FOUND)
add_executable( cannyDetector canny/canny.cpp )
target_link_libraries( cannyDetector ${OpenCV_LIBS} )
Ich bekomme die üblichen
Undefined symbols for architecture x86_64:
"vtable for cv::_InputArray", referenced from:
_main in correctImage.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for cv::_OutputArray", referenced from:
_main in correctImage.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make[2]: *** [correctImage] Error 1
make[1]: *** [CMakeFiles/correctImage.dir/all] Error 2
make: *** [all] Error 2
Die variable OpenCV_LIBS
enthält
opencv_xphoto;opencv_xobjdetect;opencv_ximgproc;opencv_xfeatures2d;opencv_tracking;opencv_text;opencv_surface_matching;opencv_saliency;opencv_rgbd;opencv_reg;opencv_optflow;opencv_line_descriptor;opencv_latentsvm;opencv_ccalib;opencv_bioinspired;opencv_bgsegm;opencv_adas;opencv_videostab;opencv_videoio;opencv_video;opencv_ts;opencv_superres;opencv_stitching;opencv_shape;opencv_photo;opencv_objdetect;opencv_ml;opencv_imgproc;opencv_imgcodecs;opencv_highgui;opencv_hal;opencv_flann;opencv_features2d;opencv_core;opencv_calib3d
Auch, die manuelle Zusammenstellung funktioniert:
gcc -o canny $(pkg-config --cflags opencv3) $(pkg-config --libs opencv3) -lstdc++ -w -O3 ../canny/canny.cpp
(Ich habe keine Ahnung, warum ich die angeben -lstdc++
, aber ohne es, die Verknüpfung scheitert aus einem anderen Grund).
Beim laufen make VERBOSE=1
, der folgende Befehl ausgeführt, für die ausführbare Datei:
/opt/local/bin/g++ -O3 -w -lstdc++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/cannyDetector.dir/canny/canny.o -o cannyDetector /usr/local/lib/libopencv_xphoto.3.0.0.dylib /usr/local/lib/libopencv_ximgproc.3.0.0.dylib /usr/local/lib/libopencv_tracking.3.0.0.dylib /usr/local/lib/libopencv_text.3.0.0.dylib /usr/local/lib/libopencv_surface_matching.3.0.0.dylib /usr/local/lib/libopencv_saliency.3.0.0.dylib /usr/local/lib/libopencv_rgbd.3.0.0.dylib /usr/local/lib/libopencv_reg.3.0.0.dylib /usr/local/lib/libopencv_optflow.3.0.0.dylib /usr/local/lib/libopencv_line_descriptor.3.0.0.dylib /usr/local/lib/libopencv_latentsvm.3.0.0.dylib /usr/local/lib/libopencv_ccalib.3.0.0.dylib /usr/local/lib/libopencv_bioinspired.3.0.0.dylib /usr/local/lib/libopencv_bgsegm.3.0.0.dylib /usr/local/lib/libopencv_adas.3.0.0.dylib /usr/local/lib/libopencv_videostab.3.0.0.dylib /usr/local/lib/libopencv_ts.a /usr/local/lib/libopencv_superres.3.0.0.dylib /usr/local/lib/libopencv_stitching.3.0.0.dylib /usr/local/lib/libopencv_photo.3.0.0.dylib /usr/local/lib/libopencv_objdetect.3.0.0.dylib /usr/local/lib/libopencv_hal.a /usr/local/lib/libopencv_xobjdetect.3.0.0.dylib /usr/local/lib/libopencv_xfeatures2d.3.0.0.dylib /usr/local/lib/libopencv_shape.3.0.0.dylib /usr/local/lib/libopencv_video.3.0.0.dylib /usr/local/lib/libopencv_calib3d.3.0.0.dylib /usr/local/lib/libopencv_features2d.3.0.0.dylib /usr/local/lib/libopencv_ml.3.0.0.dylib /usr/local/lib/libopencv_highgui.3.0.0.dylib /usr/local/lib/libopencv_videoio.3.0.0.dylib /usr/local/lib/libopencv_imgcodecs.3.0.0.dylib /usr/local/lib/libopencv_imgproc.3.0.0.dylib /usr/local/lib/libopencv_flann.3.0.0.dylib /usr/local/lib/libopencv_core.3.0.0.dylib /usr/local/lib/libopencv_hal.a -framework AGL -framework OpenGL /usr/local/share/OpenCV/3rdparty/lib/libippicv.a
Aber, wenn ich den Befehl und ersetzen Sie die input-Datei CMakeFiles/cannyDetector.dir/canny/canny.o
von der Eingabedatei ../canny/canny.cpp
- es funktioniert!
Also die Bibliotheken sind alle da, aber es immer noch nicht kompilieren, da der compiler kann link die Objekt-Datei, aber kompilieren und linken in einem Schritt funktioniert.
Kann jeder jeden schlagen, was ist hier Los?
- Benutzen Sie make VERBOSE=yes um eine ausführliche Ausgabe an, wie cmake ruft den compiler
- Haben Sie vielleicht gebaut OpenCV libs mit
libstdc++
und CMake könnte versuchenlibc++
. Vorschlag: versuchen Sieset(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libstdc++")
für CMake Datei. - Du hast Recht soweit, die fahne ist definitiv erforderlich, aber seine Abwesenheit nicht den Fehler verursachen, aber die Tatsache, dass CMake weigert sich zu finden, die Bibliotheken, die in
usr/local/lib
. - Bitte fügen Sie
message("OpenCV_LIBS=${OpenCV_LIBS}")
und poste die Ausgabe. Prüfen Sie, ob Sie es tatsächlich geschafft zu bauenhighgui
: manchmal-Bibliothek deaktivieren (wegen einigen fehlenden 3rd-party-Bibliothek zum Beispiel) in OpenCV ist nicht so sichtbar. Auch, wenn Siemake VERBOSE=1
Sie, die tatsächliche sehen können linker-Befehlszeile. - Ich habe aktualisiert die Frage nach spiegeln die jüngsten änderungen in der Fehler ich erhalte, nach dem kompilieren der Bibliothek wieder. @Antonio Es ist definitiv kein problem von bestimmten libraries, die sind alle gebaut und fertig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Update in meinem Fall war anzuweisen, CMake, wo die OpenCV-config-Modul.
Aus welchem Grund auch immer,
/opt/local/share
hatte eine höhere Priorität als/usr/local/share
und somit nur die config-Datei für OpenCV 2.4 gefunden wurde, aber ich habe 3.0. Ich bin mir nicht ganz sicher, was bewirkt, dass die Verknüpfung Fehler, aber möglicherweise ist der code wurde verschoben von Bibliotheken Header in der version 3.0, die mussten zusammengestellt werden neben den Benutzer-code, aber nicht, weil CMake nur die version 2 Header.Auch
fehlte.