2017-02-11 88 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: 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)?显然,如果库标记为IMPORTED,则不能使用target_link_libraries或target_include_directories。 – kgreenek

+0

我不确定...但是,在正常情况下,我不会一路定义自定义目标“opencv”,但我会直接调用'target_link_libraries(示例$ {OpenCV_LIBRARIES})'。 – oLen