我正在尝试将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} 的值是一个值列表,该列表将作为一个长字符串传递,而不是被拆分并作为单独的参数链接到编译器。
我已经验证了,如果IMPORTED_LOCATION是值列表(用分号分隔(,而不仅仅是库的单个路径,其他库也会失败。
我做错了什么?
问题是共享导入的库将查找一个要链接的文件。
为了解决您的问题,我将改用接口库并设置其依赖项:
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
。
oLen 的答案将起作用,但随后您将失去将库标记为 IMPORTED 的能力。
完成我试图做的事情以设置 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}")