読者です 読者をやめる 読者になる 読者になる

空飛ぶ気まぐれ雑記帳

主に趣味とかプログラミングについて扱います。

cygwinでFindOpenCVするとエラーになる

やんごとなき事情により、cygwincygwinでcmakeを使う必要がでてきたのだけれども、FindPackageでapt-cygでインストールしたOpenCVを探すとエラーが出た。

以下は実際のエラー出力

CMake Error at /lib/cmake/opencv/OpenCVModules.cmake:124 (message):
The imported target "opencv_core" references the file

"//lib/libopencv_core.dll.a"

but this file does not exist. Possible reasons include:

* The file was deleted, renamed, or moved to another location.

* An install or uninstall procedure did not complete successfully.

* The installation package was faulty and contained

"/lib/cmake/opencv/OpenCVModules.cmake"

but not all the files it references.

Call Stack (most recent call first):
/lib/cmake/opencv/OpenCVConfig.cmake:71 (include)
util/CMakeLists.txt:5 (find_package)

それで、その原因となるコードを追っかけると原因はOpenCVModules-relwithdebinfo.cmakeにあった。
以下はその1行目から17行目を抜粋したコード

#----------------------------------------------------------------
# Generated CMake target import file for configuration "RelWithDebInfo".
#----------------------------------------------------------------

# Commands may need to know the format version.
set(CMAKE_IMPORT_FILE_VERSION 1)

# Import target "opencv_core" for configuration "RelWithDebInfo"
set_property(TARGET opencv_core APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)
set_target_properties(opencv_core PROPERTIES
  IMPORTED_IMPLIB_RELWITHDEBINFO "${_IMPORT_PREFIX}/lib/libopencv_core.dll.a"
  IMPORTED_LINK_INTERFACE_LIBRARIES_RELWITHDEBINFO ""
  IMPORTED_LOCATION_RELWITHDEBINFO "${_IMPORT_PREFIX}/bin/cygopencv_core-2.4.dll"
  )

list(APPEND _IMPORT_CHECK_TARGETS opencv_core )
list(APPEND _IMPORT_CHECK_FILES_FOR_opencv_core "${_IMPORT_PREFIX}/lib/libopencv_core.dll.a" "${_IMPORT_PREFIX}/bin/cygopencv_core-2.4.dll" )

つまるところ/lib/opencv_core.dll.aに探したいライブラリがあるんだけど、_IMPORT_PREFIXが/の場合//lib/opencv_core.dll.aに成ってしまっているというのが問題です。本来Linuxでは/をいくつ重ねても許容されますが、cygwinでは//がWindows環境における\\と同一の意味として解釈されるため、libとういう名前のサーバー無いためエラーとなります。

というわけで、このコードの8行目に以下のコードを追加して末尾の/を削除するように変更。

string(REPLACE "/" ";" _IMPORT_PREFIX_TEMP ${_IMPORT_PREFIX})
list(LENGTH _IMPORT_PREFIX_TEMP _IMPORT_PREFIX_LENGTH)
SET(_IMPORT_ITERATION_COUNT 2)
while(${_IMPORT_ITERATION_COUNT} LESS ${_IMPORT_PREFIX_LENGTH})
  math(EXPR _INSERT_POSITION "${_IMPORT_ITERATION_COUNT} - 2")
  list(INSERT ${_INSERT_POSITION} ${_IMPORT_ITERATION_COUNT} "/")
  math(EXPR _IMPORT_ITERATION_COUNT "${_IMPORT_ITERATION_COUNT}+1")
endwhile()

string(CONCAT _IMPORT_PREFIX ${_IMPORT_PREFIX_TEMP})

unset(_INSERT_POSITION)
unset(_IMPORT_PREFIX_TEMP)
unset(_IMPORT_PREFIX_LENGTH)
unset(_IMPORT_ITERATION_COUNT)

結構アドホックな気がするけど、急ぎの案件だったのでとりあえず、これで解消しました。
同じ症状に陥って、他にこうしたらなんかCMake通ったよみたいな人いたら教えて欲しいです。