Linking problem mit OpenCV und CMake
Ich Schreibe ein Programm, das verwendet OpenCV (installiert in einem lokalen Verzeichnis, da ich nicht über root-Berechtigungen auf der Maschine), und ich habe geschrieben, die entsprechenden CMakeLists.txt Datei. Mein problem ist, dass die Kompilierung fehlschlägt bei der Anbindung der Bühne in verschiedene Arten (ich habe die drei Stunden versucht, all die verschiedenen vorgeschlagenen Lösungen auf dem web, also ich habe gesehen, viele Ergebnisse).
Hier sind die Konfigurationen/Ergebnisse, die machen mehr Sinn für mich, auch wenn Sie zu einem Fehler führen:
[in project_root/CMakeLists.txt]:
cmake_minimum_required(VERSION 2.8)
project(CUDA_learning)
set(OpenCV_INCLUDE_DIR "path/to/opencv_CUDA/include")
include_directories(${OpenCV_INCLUDE_DIR})
set(OpenCV_LIBS_DIR "path/to/opencv_CUDA/lib")
link_directories(${OpenCV_LIBS_DIR})
set(OpenCV_LIBS "opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu")
find_package(Boost COMPONENTS system filesystem program_options regex REQUIRED)
if(Boost_FOUND)
include_directories(${Boost_INCLUDE_DIR})
else(Boost_FOUND)
message(FATAL_ERROR "Cannot build application without Boost. Please set Boost_INCLUDE_DIR.")
endif(Boost_FOUND)
set(CMAKE_BUILD_TYPE debug)
add_definitions("-Wall")
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/../bin)
subdirs (
../src
)
[in project_root/src/CMakeLists.txt]:
FILE(GLOB dir_source *.cc 2D/*.cc)
FILE(GLOB dir_header *.hh 2D/*.hh)
add_executable(${PROJECT_NAME} ${dir_source} ${dir_header})
target_link_libraries(${PROJECT_NAME} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${OpenCV_LIBS})
Ergebnis:
Linking CXX executable ../../bin/CUDA_learning
c++: opencv_imgproc: No such file or directory
c++: opencv_calib3d: No such file or directory
c++: opencv_video: No such file or directory
c++: opencv_features2d: No such file or directory
c++: opencv_ml: No such file or directory
c++: opencv_highgui: No such file or directory
c++: opencv_objdetect: No such file or directory
c++: opencv_contrib: No such file or directory
c++: opencv_legacy: No such file or directory
c++: opencv_gpu: No such file or directory
Wenn, im Gegensatz zu den Empfehlungen im Netz, die ich setzen Sie ein "-l", bevor die OpenCV-library-name, den ich bekommen:
Linking CXX executable ../../bin/CUDA_learning
/usr/bin/ld: cannot find -lopencv_core
collect2: ld returned 1 exit status
make[2]: *** [../bin/CUDA_learning] Error 1
make[1]: *** [src/CMakeFiles/CUDA_learning.dir/all] Error 2
make: *** [all] Error 2
Weiß jemand, wie man dieses Problem lösen, was? Ich bin buchstäblich fahren verrückt auf das...
Vielen Dank im Voraus!
Cheers,
Rob
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist hier die richtige Lösung, um OpenCV in das Projekt:
Diese Zeile:
...sagt, dass Sie haben eine Bibliothek in der OpenCV_LIBS variable mit einem gigantischen name mit vielen Leerzeichen. Wenn Sie entfernen die Anführungszeichen, wie folgt:
...dann wird es eine Liste von Bibliotheksnamen, und es sollte gut funktionieren.
CMake verwendet das Leerzeichen getrennten Argumente auf seine Befehle. Weil das so ist, um einen Raum in einen Wert in der set-Befehl, müssen Sie die doppelte quote. In diesem Fall, Sie nicht tun wollen, weil Sie wollen, dass der set-Befehl zu sehen, der mehrere Werte, die Sie übergeben haben, und nicht einen großen Wert, der Leerzeichen enthält.
EDIT: (weitere Informationen auf der Grundlage der Diskussion in den Kommentaren):
Wenn dies immer noch nicht funktioniert, überprüfen Sie, dass die Namen, die Sie verwenden, korrekt sind. Mit dem library-Namen, die Sie verwenden, hier sollte es eine Datei namens libopencv_core.so, libopencv_imgproc.so, und so weiter, das Verzeichnis, indem Sie den OpenCV_LIBS_DIR variable. Wenn die genauen Bibliothek Namen nicht als Dateien, dann erklärt, dass das linker-Fehler. (In diesem Fall, wie bereits in den Kommentaren, die tatsächlichen Dateien, die benannt wurden, die mit Versionsnummern in den Dateinamen und es gab keine "nicht versioniert" symlinks auf Sie.)
das problem könnte sein, dass der linker ist auf der Suche nach einer Datei namens
libopencv_core.so
aber es gibt eine Datei mit einem ähnlichen Namenlibopencv_core.so.1
in diesem Fall müssen Sie die Verwendung von symbolischen links. zum Beispiel tun diesln -sf /opt/lib/libopencv_core.so.1 /opt/lib/libopencv_core.so