CMAKE:导入时链接OpenCV失败

时间:2017-02-11 10:04:46

标签: c++ cmake

我正在尝试将OpenCV导入到我的CMakeLists.txt文件中。这是我正在使用的代码:

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)

然而,这无法建立。我碰巧使用Ninja,但它也因为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}的值是一个值列表,该列表作为一个长字符串传递,而不是被拆分并作为单独的args链接到编译器。

如果IMPORTED_LOCATION是一个值列表(用分号分隔)而不是仅仅是一个库的单个路径,我已经验证其他库也会失败。

我做错了什么?

2 个答案:

答案 0 :(得分: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}")

根据您的CMake版本,甚至可能不需要target_include_directories

答案 1 :(得分:1)

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