2017-02-11 4 views
0

Ich versuche OpenCV in meine CMakeLists.txt Datei zu importieren. Hier ist der Code Ich verwende:CMAKE: Linking OpenCV schlägt fehl beim Importieren

find_package(OpenCV 3 REQUIRED) 
add_library(opencv SHARED IMPORTED) 
set_target_properties(opencv PROPERTIES 
    INTERFACE_INCLUDE_DIRECTORIES "${OpenCV_INCLUDE_DIRS}" 
    IMPORTED_LOCATION "${OpenCV_LIBS}") 

Später in der Cmake Datei erstelle ich ein Ziel, das zu opencv verbindet, etwa so:

add_executable(sample "src/sample.cpp") 
target_link_libraries(sample opencv) 

Dies ist jedoch nicht zu bauen. Ich benutze Ninja, aber es scheitert auch mit Make. Hier

ist der Fehler, den ich immer bin, wenn ich versuche mit Ninja zu bauen:

ninja: error: stat(opencv_viz;opencv_videostab;opencv_videoio;opencv_video;opencv_superres;opencv_stitching;opencv_shape;opencv_photo;opencv_objdetect;opencv_ml;opencv_imgproc;opencv_imgcodecs;opencv_highgui;opencv_flann;opencv_features2d;opencv_cudev;opencv_cudawarping;opencv_cudastereo;opencv_cudaoptflow;opencv_cudaobjdetect;opencv_cudalegacy;opencv_cudaimgproc;opencv_cudafilters;opencv_cudafeatures2d;opencv_cudacodec;opencv_cudabgsegm;opencv_cudaarithm;opencv_core;opencv_calib3d): File name too long 

eindeutig den Wert von $ {OpenCV_LIBS} ist eine Liste von Werten, und diese Liste wird immer als eine lange Zeichenfolge übergeben anstatt aufgeteilt und als einzelne Args mit dem Compiler verknüpft zu werden.

Ich habe überprüft, dass andere Bibliotheken auch fehlschlagen, wenn die IMPORTED_LOCATION eine Liste von Werten (durch Semikolon getrennt) anstatt nur ein einzelner Pfad zu einer Bibliothek ist.

Was mache ich falsch?

+0

I Cmake Version bin mit 3.5.2 FYI – kgreenek

Antwort

0

Die Antwort von oLen funktioniert, aber dann verlieren Sie die Fähigkeit, die Bibliothek als IMPORTED zu markieren.

Ein besserer Weg, um das zu erreichen, was ich versuchte, um die Eigenschaft INTERFACE_LINK_LIBRARIES zu setzen. Die Bibliothek sollte auch eine INTERFACE-Bibliothek anstelle von SHARED sein.

So ist die cmake Config, das Ziel zu importieren wird:

find_package(OpenCV 3 REQUIRED) 
add_library(opencv INTERFACE IMPORTED) 
set_target_properties(opencv PROPERTIES 
    INTERFACE_INCLUDE_DIRECTORIES "${OpenCV_INCLUDE_DIRS}" 
    INTERFACE_LINK_LIBRARIES "${OpenCV_LIBS}") 
1

Das Problem ist, dass eine gemeinsam genutzte importierte Bibliothek nach eine Datei suchen wird, um zu verknüpfen.

Ihr Problem zu lösen, würde ich eine Interface-Bibliothek statt und setzen Sie seine Abhängigkeiten verwenden:

find_package(OpenCV 3 REQUIRED) 
add_library(opencv INTERFACE) 
target_include_directories(opencv INTERFACE "${OpenCV_INCLUDE_DIRS}") 
target_link_libraries(opencv INTERFACE "${OpenCV_LIBS}") 

Die target_include_directories kann nicht einmal abhängig von Ihrer CMake Version erforderlich sein.

+0

Danke Ihnen danken! Ich frage mich nur, gibt es einen Grund, nicht immer nur eine Interface-Bibliothek zu verwenden? Oder ist es besser, set_target_properties() zu verwenden, wenn nur eine Datei für die Bibliothek vorhanden ist? – kgreenek

+0

Anders ausgedrückt: Gibt es einen Wert, indem Sie add_library (opencv INTERFACE IMPORTED) statt nur add_library (opencv INTERFACE) verwenden? Anscheinend können Sie target_link_libraries oder target_include_directories nicht verwenden, wenn die Bibliothek als IMPORTED markiert wurde. – kgreenek

+0

Ich bin mir nicht sicher ... Allerdings würde ich im Normalfall nicht den ganzen Weg gehen, um ein benutzerdefiniertes Ziel "opencv" zu definieren, aber ich würde direkt 'target_link_libraries (Beispiel $ {OpenCV_LIBRARIES})' aufrufen. – oLen

Verwandte Themen