2017-02-11 7 views
0

Я пытаюсь импортировать OpenCV в мой файл CMakeLists.txt. Вот код, я использую:CMAKE: связывание OpenCV сбой при импорте

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}") 

Далее в файле CMake, я создаю цель, ссылки на OpenCV, как так:

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

Однако это не удается построить. Я, случается, использую ниндзя, но он не работает с Make тоже.

Здесь ошибка я получаю, когда я пытаюсь построить с Ninja:

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 

Очевидно, что значение $ {OpenCV_LIBS} представляет собой список значений, и этот список становится передается в качестве одной длинной строки вместо того, чтобы разделяться и связываться как отдельные аргументы с компилятором.

Я проверял, что другие библиотеки также не работают, если IMPORTED_LOCATION - это список значений (разделенных точкой с запятой), а не только один путь к библиотеке.

Что я делаю неправильно?

+0

Я использую CMake версии 3.5.2 FYI – kgreenek

ответ

0

Ответ oLen будет работать, но тогда вы потеряете возможность отмечать библиотеку как IMPORTED.

Лучший способ выполнить то, что я пытался сделать, чтобы установить свойство INTERFACE_LINK_LIBRARIES. Библиотека также должна быть библиотекой INTERFACE вместо SHARED.

Так CMake конфигурации импортировать цель становится:

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

Проблема заключается в том, что общая импортированная библиотека будет искать один файл для ссылки.

Чтобы решить проблему, я хотел бы использовать библиотеку интерфейса вместо и установить его зависимости:

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

target_include_directories может даже не потребоваться в зависимости от версии CMake.

+0

Спасибо спасибо! Просто интересно, есть ли причина не всегда просто использовать библиотеку интерфейсов? Или лучше использовать set_target_properties(), если для библиотеки есть только один файл? – kgreenek

+0

С другой стороны: есть ли какое-либо значение, используя add_library (opencv INTERFACE IMPORTED) вместо просто add_library (opencv INTERFACE)? По-видимому, вы не можете использовать target_link_libraries или target_include_directories, если библиотека была отмечена IMPORTED. – kgreenek

+0

Я не уверен ... Однако в нормальном случае я бы не стал полностью определять пользовательскую целевую «opencv», но я бы назвал непосредственно «target_link_libraries (sample $ {OpenCV_LIBRARIES})». – oLen