mingw クロスコンパイル時に windres エラーが出るときの解決法

OpenCV のクロスコンパイルをしているときに、windres が見つからないというエラーが出た。普通、クロスコンパイルする際に、GCC や G++ (GXX) の設定はするが、リソースコンパイラというものも設定しなければいけなかったようで、そこにはまってしまった。結構エラーで困っている人は多いようなので、書いてみる。

CMAKE の設定として書いているが、他の環境でも役立つはずである。

どうやら

  1. -DCMAKE_SYSTEM_NAME=Windows
  2. -DENABLE_PRECOMPILED_HEADERS:BOOL=OFF
  3. -DCMAKE_C_COMPILER=i686-w64-mingw32-gcc-7.3-posix -DCMAKE_CXX_COMPILER=i686-w64-mingw32-g++-posix -DCMAKE_RC_COMPILER=i686-w64-mingw32-windres

の3つくらいをやっておけばよいようだ。最後のうち、RC_COMPILER の設定は、よく考えればアタリマエではあるはずなのだが、なかなか気づけなかった。VC++ とか使ったことがないし…。
2つ目は、エラーが出なければ入れなくても良いと思う。

私が実際に投げたコマンドは以下である

cmake -DENABLE_PRECOMPILED_HEADERS:BOOL=OFF -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_CXX_COMPILER=i686-w64-mingw32-g++-posix -DCMAKE_C_COMPILER=i686-w64-mingw32-gcc-7.3-posix -DCMAKE_RC_COMPILER=i686-w64-mingw32-windres -D CMAKE_BUILD_TYPE:STRING=RELEASE -D BUILD_SHARED_LIBS:BOOL=ON -D CMAKE_CXX_FLAGS:STRING="-pipe -O2 -std=gnu++14 -Wa,-mbig-obj" -D CPU_DISPATCH:STRING="SSE4_1;SSE4_2;" -D WITH_ITT:BOOL=OFF -D WITH_IPP:BOOL=OFF -D WITH_OPENMP:BOOL=ON -D WITH_OPENGL:BOOL=ON -D ENABLE_FAST_MATH:BOOL=ON -D BUILD_PERF_TESTS:BOOL=OFF -D BUILD_TESTS:BOOL=OFF -D BUILD_EXAMPLES:BOOL=OFF -D CMAKE_INSTALL_PREFIX:PATH=/home/tako/progs/opencv-3.4.5_install_mingw32/ -D OPENCV_EXTRA_MODULES_PATH:PATH=/home/tako/progs/opencv_contrib-3.4.5/modules/ -DOPENCV_ENABLE_NONFREE:BOOL=ON -DENABLE_PRECOMPILED_HEADERS:BOOL=OFF -G Ninja ../opencv-3.4.5/
ninja -v -j3 install

ninja は早かった。ninja が不要な人は -G Ninja を外せばよい。

cygwinでcmakeを利用したwindowsアプリケーションのビルド に

# クロスコンパイルのターゲットのシステム名SET(CMAKE_SYSTEM_NAME Windows)# クロスコンパイラ等の設定SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc)SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres)#Cフラグの設定#ビルドタイプに共通の設定set(CMAKE_C_FLAGS "-Wall -Wextra")set(CMAKE_CXX_FLAGS "-Wall -Wextra")#Debugビルドに利用する設定set(CMAKE_C_FLAGS_DEBUG "-g3 -gdwarf-2")set(CMAKE_CXX_FLAGS_DEBUG "-g3 -gdwarf-2")# ビルド環境(cygwin)での、ターゲット用の環境の場所SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32)# cmakeのFIND_XXX() コマンドのデフォルト設定set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

ときちんと書いてあったので、これを見て助けられた。数時間意味が分からず彷徨ってしまった。感謝したい。

Instruction

Give cmake options:

  1. -DCMAKE_SYSTEM_NAME=Windows
  2. -DENABLE_PRECOMPILED_HEADERS:BOOL=OFF
  3. -DCMAKE_C_COMPILER=i686-w64-mingw32-gcc-7.3-posix -DCMAKE_CXX_COMPILER=i686-w64-mingw32-g++-posix -DCMAKE_RC_COMPILER=i686-w64-mingw32-windres

Don't forget to set CMAKE_RC_COMPILER when you encounter windres errors. 2. may be deletable.

misc

Posted by tako