Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMAKE:导入时链接OpenCV失败_C++_Cmake - Fatal编程技术网

C++ CMAKE:导入时链接OpenCV失败

C++ CMAKE:导入时链接OpenCV失败,c++,cmake,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}") 稍后

我正在尝试将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)
然而,这无法建立。我碰巧用的是忍者,但它在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}的值是一个值列表,该列表将作为一个长字符串传递,而不是拆分并作为单个参数链接到编译器

我已经验证过,如果导入的_位置是一个值列表(用分号分隔),而不是库的单个路径,那么其他库也会失败


我做错了什么?

问题是,共享导入库将查找一个要链接的文件

为了解决您的问题,我将使用接口库,并设置其依赖项:

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\u include\u目录甚至可能不是必需的。

问题在于,共享导入库将查找一个要链接的文件

为了解决您的问题,我将使用接口库,并设置其依赖项:

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\u include\u目录甚至可能不是必需的。

oLen的答案会起作用,但是您将失去将库标记为导入的能力

一种更好的方法是设置INTERFACE_LINK_LIBRARIES属性,以完成我试图完成的任务。该库还应该是一个接口库,而不是共享库

因此,导入目标的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}")

oLen的答案是可行的,但是您将失去将库标记为导入的能力

一种更好的方法是设置INTERFACE_LINK_LIBRARIES属性,以完成我试图完成的任务。该库还应该是一个接口库,而不是共享库

因此,导入目标的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}")

谢谢,谢谢!!只是想知道,有没有理由不总是只使用接口库?或者,当库只有一个文件时,使用set_target_properties()更好吗?另一种说法是:使用add_library(opencv接口导入)而不是add_library(opencv接口导入)是否有任何值?显然,如果库被标记为已导入,则无法使用目标链接库或目标包含目录。我不确定。。。然而,在正常情况下,我不会千方百计定义自定义目标“opencv”,但我会直接调用
target\u link\u库(sample${opencv\u libraries})
。谢谢!只是想知道,有没有理由不总是只使用接口库?或者,当库只有一个文件时,使用set_target_properties()更好吗?另一种说法是:使用add_library(opencv接口导入)而不是add_library(opencv接口导入)是否有任何值?显然,如果库被标记为已导入,则无法使用目标链接库或目标包含目录。我不确定。。。然而,在正常情况下,我不会千方百计定义自定义目标“opencv”,但我会直接调用
target\u link\u库(sample${opencv\u libraries})
。我使用的是cmake版本3.5.2 FYII,我使用的是cmake版本3.5.2 FYI