mingw クロスコンパイル時に windres エラーが出るときの解決法
OpenCV のクロスコンパイルをしているときに、windres が見つからないというエラーが出た。普通、クロスコンパイルする際に、GCC や G++ (GXX) の設定はするが、リソースコンパイラというものも設定しなければいけなかったようで、そこにはまってしまった。結構エラーで困っている人は多いようなので、書いてみる。
CMAKE の設定として書いているが、他の環境でも役立つはずである。
どうやら
- -DCMAKE_SYSTEM_NAME=Windows
- -DENABLE_PRECOMPILED_HEADERS:BOOL=OFF
- -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:
- -DCMAKE_SYSTEM_NAME=Windows
- -DENABLE_PRECOMPILED_HEADERS:BOOL=OFF
- -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.
ディスカッション
コメント一覧
まだ、コメントがありません