簡體   English   中英

如何使用 CMake 正確鏈接 Visual Studio 項目與 OpenCV(超級包)

[英]How to properly link Visual Studio project with OpenCV (superpack) using CMake

我目前正在對舊的 VHS 磁帶進行數字化處理。 對於后處理,我想用 C++ 和 OpenCV 實現自定義算法。我已經在 Matlab 中實現了一個有前途的原型,但它只能處理單個圖像(在我的版本 (R2010a) 中無法讀取/寫入視頻文件) ; 另外,Matlab 太慢了)。

可悲的是,我 - 一遍又一遍 - 堅持使用 CMake。雖然我想知道......這不會那么困難。 經常遇到 CMake 的問題,所以我會在這里詳細介紹 go。 我希望您不僅可以指出我在這里做錯了什么,還可以對我對 CMake 的使用提出一般性建議。 也許我做錯了,我不知道。

這是我到目前為止所做的:

  1. 我已經從 sourceforge 下載了OpenCV 2.3.1 超級包 超級包包含 OpenCV 源代碼,包括 - 最重要的 - 所有主要平台的 .lib 和 .dll 文件。 因此,我不需要自己構建 OpenCV。 它已經完成了。 我只需要使用/鏈接它。
  2. 我在C:\dev\vs2010sp1_win32\opencv\2.3.1中安裝(即提取到)超級包。
  3. 我已將C:\dev\vs2010sp1_win32\opencv\2.3.1\OpenCVConfig.cmake.inOpenCVConfig.cmake
  4. 我為我的項目C:\dev\VhsDejitterizer創建了一個文件夾,其結構如下:

VhsDejitterizer/
    CMakeLists.txt (A)
    src/
        CMakeLists.txt (B)
        libvhsdejitter/
            CMakeLists.txt (C)
            vhsdejitter/
                util.h
                util.cpp
        main/
            CMakeLists.txt (D)
            main.cpp

以下是各個 CMakeLists.txt 文件的內容。

/CMakeLists.txt (一)

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT("VhsDejitterizer")

CMAKE_POLICY(SET CMP0015 OLD)
FIND_PACKAGE(OpenCV REQUIRED
            NO_MODULE
            PATHS "C:/dev/vs2010sp1_win32/opencv/2.3.1"
            NO_DEFAULT_PATH)

ADD_SUBDIRECTORY("src")

/src/CMakeLists.txt (B)

ADD_SUBDIRECTORY("libvhsdejitter")
ADD_SUBDIRECTORY("main")

/src/libvhsdejitter/CMakeLists.txt (C)

UNSET(source_files)
FILE(GLOB_RECURSE source_files "*.h" "*.cpp")

ADD_LIBRARY(libvhsdejitter STATIC ${source_files})
TARGET_LINK_LIBRARIES(libvhsdejitter ${OpenCV_LIBS})

UNSET(source_files)

/src/main/CMakeLists.txt (D)

UNSET(source_files)
FILE(GLOB_RECURSE source_files "*.h" "*.cpp")

ADD_EXECUTABLE(main ${source_files})
TARGET_LINK_LIBRARIES(main libvhsdejitter ${OpenCV_LIBS})

UNSET(source_files)

配置和生成 Visual Studio.sln (...) 文件效果很好。 事實上,我沒有收到任何警告或錯誤:

Configuring done
Generating done

但是,我在 Visual Studio 中構建“主”項目的嘗試失敗了:

1>------ Build started: Project: main, Configuration: Debug Win32 ------
1>Build started 04.04.2012 14:38:47.
1>InitializeBuildStatus:
1>  Touching "main.dir\Debug\main.unsuccessfulbuild".
1>CustomBuild:
1>  All outputs are up-to-date.
1>ClCompile:
1>  main.cpp
1>LINK : fatal error LNK1104: cannot open file '@CMAKE_LIB_DIRS_CONFIGCMAKE@/libopencv_gpu.so.@OPENCV_VERSION@@OPENCV_DLLVERSION@@OPENCV_DEBUG_POSTFIX@.lib'
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.59
========== Build: 0 succeeded, 1 failed, 2 up-to-date, 0 skipped ==========

更多詳情:

  • 操作系統:Windows 7 Pro 64位
  • IDE:Visual Studio 2010 SP1
  • CMake 版本:2.8.4
  • 目標平台(即我正在編譯/構建什么):Windows 32 位

我的問題:

  1. 如何成功構建“主要”項目? 即如何修復該錯誤?
  2. 這些@VARIABLE_OR_SOMETHING@是什么? 我試圖找出它們的來源,它們似乎是在OpenCVConfig.cmake中設置的。 但它們應該如何工作? 它們應該在“構建時”由 Visual Studio 評估嗎? 如果有,他們是如何評價的?
  3. 您可能已經注意到我設置了一個相當復雜的文件夾結構。 你對此有何建議? 你如何組織你的圖書館和項目? 有最佳實踐嗎? 他們在哪里記錄?

謝謝你和最好的問候,羅伯特

這些變量可能與 CMake 的configure_file命令有關,它允許您指定參數化模板文檔(通常擴展名以.in結尾),您可以將 CMake 變量替換到文件中以創建它。 它們在運行 CMake 時發生的configure_file調用時被評估。我認為發生的事情是你所采用的腳本將有一個父 CMake 腳本,它將使用這些變量的內容配置該文件,並且然后在add_subdirectory調用中使用它。 我建議檢查任何描述頂級運行過程的自述文件(或任何定義這些變量然后手動替換它們的文件)。

我現在修好了。 我想我可以肯定地說整個混亂不是我的錯。 很抱歉回答我自己的問題。


這是我首先嘗試的(當然,這對我不起作用,但它可能對其他人有用):

正如 Martin Foot 在他的回答中指出的那樣,*.in 文件是模板,應該在 CMake 配置期間填寫正確的值。 但是,我使用的是 OpenCV 超級包,其中包含所有二進制文件。 出於這個原因,我從來沒有執行過這樣的配置步驟,因為我認為只有在您想要編譯某些東西時才需要這樣做。

但是,似乎 - 即使您使用帶有預構建二進制文件的超級包 - 您也必須配置項目才能生成 OpenCVConfig.cmake。 Vadim Pisarevsky在 OpenCV bug tracker 中表示

出於某種原因,這對我不起作用。 我像往常一樣啟動 Cmake GUI,將其指向 OpenCV 目錄並點擊“配置”。 我什至絕望地點擊了“生成”。 然而,沒有出現 OpenCVConfig.cmake。

所以我不得不進一步撥打 go...


這才是真正有用的:

在最近提交的與 OpenCVConfig.cmake 相關的錯誤報告中, Sergiu Dotenco 指出“當前提供的 OpenCVConfig.cmake 非常脆弱”等等。幸運的是,Sergio 還提供了一個自定義的 FindOpenCV.cmake 腳本 通過使用他的腳本,我終於能夠生成一個有效的 Visual Studio 解決方案。

順便說一下,這是我當前的頂級 CMakeLists.txt:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT("VhsDejitterizer")

SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules" ${CMAKE_MODULE_PATH})

SET(OPENCV_ROOT_DIR "C:/dev/vs2010sp1_win32/opencv/2.3.1")
#SET(OPENCV_USE_GPU_LIBS ON)
FIND_PACKAGE(OpenCV REQUIRED)

ADD_SUBDIRECTORY("src")

我在項目的新cmake-modules/子文件夾中安裝了 Sergio 的FindOpenCV.cmake腳本。 同樣重要的是要注意我正在使用(與我使用“配置模式”的原始設置相反)最小的 FIND_PACKAGE 變體( “模塊模式” )。 僅當使用最小變體時,CMake 才會在 CMake 模塊路徑中Find<package-name>.cmake腳本。 有關 FIND_PACKAGE 的信息,請參閱CMake 文檔


我還找到了本指南,如果您是圖書館開發人員,它是關於如何正確使用 CMake 的: http://www.vtk.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file

我現在修好了。 我想我可以肯定地說整個混亂不是我的錯。 很抱歉回答我自己的問題。

你修好了? 我遇到了同樣的問題,我按照你的解決方案做了,但是沒有用。 當 CMake 執行命令 FIND_PACKAGE( OpenCV REQUIRED )

它將是 output:

One or more OpenCV components were not found:
  calib3d
  contrib
  core
  features2d
  flann
  highgui
  imgproc
  legacy
  ml
  objdetect
  video
CMake Error at C:/Program Files/CMake 2.8/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:91 (MESSAGE):
  Could NOT find OpenCV (missing: OPENCV_CALIB3D_LIBRARY
  OPENCV_CONTRIB_LIBRARY OPENCV_CORE_LIBRARY OPENCV_FEATURES2D_LIBRARY
  OPENCV_FLANN_LIBRARY OPENCV_HIGHGUI_LIBRARY OPENCV_IMGPROC_LIBRARY
  OPENCV_LEGACY_LIBRARY OPENCV_ML_LIBRARY OPENCV_OBJDETECT_LIBRARY
  OPENCV_VIDEO_LIBRARY) (found version "2.3.1")

最后,我使用命令 include_directories TARGET_LINK_LIBRARIES 來包含所有必要的目錄或文件,它以一種笨拙的方式工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM