Freitag, April 10, 2020

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 versuchen libc++. Vorschlag: versuchen Sie set(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 bauen highgui: manchmal-Bibliothek deaktivieren (wegen einigen fehlenden 3rd-party-Bibliothek zum Beispiel) in OpenCV ist nicht so sichtbar. Auch, wenn Sie make 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.
InformationsquelleAutor oarfish | 2015-05-02

1 Kommentar

  1. 5

    Das Update in meinem Fall war anzuweisen, CMake, wo die OpenCV-config-Modul.

    find_package(OpenCV REQUIRED PATHS /usr/local/share/OpenCV NO_DEFAULT_PATH) # manual specification of the OpenCVConfig.cmake path is necessary since otherwise, cmake assigns /opt/local a higher priority and ocv2.4 will be used

    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

    include_directories(${OpenCV_INCLUDE_DIRS})

    fehlte.

    • Danke. Es half mir auch!

Kostenlose Online-Tests