[英]CMAKE: Linking OpenCV fails when imported
我正在嘗試將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}的值是一個值列表,該列表將作為一個長字符串傳遞,而不是作為單獨的arg拆分並鏈接到編譯器。
我已經驗證,如果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的答案會起作用,但是您將無法將庫標記為已導入。
完成我試圖設置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}")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.