cygwinでFindOpenCVするとエラーになる
やんごとなき事情により、cygwinでcygwinで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通ったよみたいな人いたら教えて欲しいです。