hybridgroup / gocv

Go package for computer vision using OpenCV 4 and beyond. Includes support for DNN, CUDA, OpenCV Contrib, and OpenVINO.
https://gocv.io
Other
6.66k stars 865 forks source link

window build static binary #638

Open thanatos915 opened 4 years ago

thanatos915 commented 4 years ago

Description

win 10 上打包静态库,运行报错。我不确定是我编译的错误,还是代码错误

Steps to Reproduce

my directory like this Image of Yaktocat

  1. build opencv static
    cd /D C:\opencv\build
    cmake C:\opencv\opencv-4.2.0 -G "MinGW Makefiles" -BC:\opencv\build -DENABLE_CXX11=ON -DOPENCV_EXTRA_MODULES_PATH=C:\opencv\opencv_contrib-4.2.0\modules -DBUILD_SHARED_LIBS=OFF -DWITH_IPP=OFF -DWITH_MSMF=OFF -DBUILD_EXAMPLES=OFF -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_java=OFF -DBUILD_opencv_python=OFF -DBUILD_opencv_python2=OFF -DBUILD_opencv_python3=OFF -DBUILD_DOCS=OFF -DENABLE_PRECOMPILED_HEADERS=OFF -DBUILD_opencv_saliency=OFF -DCPU_DISPATCH= -DOPENCV_GENERATE_PKGCONFIG=ON -DWITH_OPENCL_D3D11_NV=OFF -Wno-dev
    mingw32-make -j 10
    mingw32-make install
  2. after build. my directory like this Image of Yaktocat
  3. I tried
    set CGO_LDFLAGS=-LC:\opencv\build\install\x64\mingw\staticlib .......

    or edit gocv/cgo.go

    
    // +build !customenv,!openvino

package gocv

// Changes here should be mirrored in contrib/cgo.go and cuda/cgo.go.

/*

cgo !windows pkg-config: opencv4

cgo CXXFLAGS: --std=c++11

cgo windows CPPFLAGS: -IC:/opencv/build/install/include

cgo windows LDFLAGS: -LC:/opencv/build/install/x64/mingw/staticlib -lopencv_core420 -lopencv_face420 -lopencv_videoio420 -lopencv_imgproc420 -lopencv_highgui420 -lopencv_imgcodecs420 -lopencv_objdetect420 -lopencv_features2d420 -lopencv_video420 -lopencv_dnn420 -lopencv_xfeatures2d420 -lopencv_plot420 -lopencv_tracking420 -lopencv_img_hash420 -lopencv_calib3d420

*/ import "C"

go build -a -ldflags '-extldflags "-static"' -o app.exe



#### but I always get errors.   not found libopencv_core420 or  syntax errors

我的项目即将上线,很急。但是又不希望在其他电脑上配置复杂的opencv 环境。需要一个纯静态的exe文件

## My Environment
* Operating System and version: win10
* OpenCV version used: 4.20
* How did you install OpenCV?  
* GoCV version used:  0.22.0
* Go version: go version go1.14 windows/amd64
* Did you run the `env.sh` or `env.cmd` script before trying to `go run` or `go build`? no
thanatos915 commented 4 years ago

who can help me。 thanks。

rming commented 4 years ago

217 @thanatos915

marcown commented 3 years ago

I have a solution:

How to build opencv in windows:

Download and run the MinGW-W64 compiler installer from https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/7.3.0/ The latest version of the MinGW-W64 toolchain is 7.3.0, but any version from 7.X on should work. Choose the options for “posix” threads, and for “seh” exceptions handling, then install to the default location c:\Program Files\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev2. Add the C:\Program Files\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev2\mingw64\bin path to your System Path.

CMake

Download and install CMake https://cmake.org/download/ to the default location. CMake installer will add CMake to your system path. Add C:\opencv\build\install\x64\mingw\bin to your System Path.

VideoIO is not working

delete all videoio files in %GOPATH%\src\gocv.io\x\gocv for videoio to work you need to add ffmped statically, I did not found a good solution for this yet.

compile it:

change win_build_opencv.cmd cmake line to:

cmake -G "MinGW Makefiles" -BC:\opencv\build -DOPENCV_EXTRA_MODULES_PATH=C:\opencv\opencv_contrib-4.5.1\modules -D WITH_IPP=OFF -D WITH_OPENCL=OFF -DBUILD_opencv_hdf=OFF -D BUILD_TIFF=ON -D WITH_TIFF=ON -D BUILD_PNG=ON -D WITH_PNG=ON -D BUILD_ZLIB=ON -D WITH_JASPER=OFF -D WITH_OPENEXR=OFF -D BUILD_OPENEXR=OFF -D BUILD_SHARED_LIBS=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_opencv_apps=OFF -D BUILD_examples=OFF -D BUILD_opencv_datasets=OFF -D BUILD_opencv_line_descriptor=OFF -DWITH_GTK=OFF -DENABLE_PRECOMPILED_HEADERS=OFF -DOPENCV_GENERATE_PKGCONFIG=ON -DWITH_WIN32UI=ON -DWITH_MSMF=OFF -DBUILD_opencv_python3=OFF -DBUILD_opencv_python2=OFF -DENABLE_CXX11=ON -DBUILD_opencv_java=OFF -DBUILD_opencv_python=OFF -DWITH_OPENCL_D3D11_NV=OFF -DOPENCV_ALLOCATOR_STATS_COUNTER_TYPE=int64_t -Wno-dev C:\opencv\opencv-4.5.1

then

chdir %GOPATH%\src\gocv.io\x\gocv
win_build_opencv.cmd

set PKG_CONFIG_PATH=C:\opencv\build\unix-install
pkg-config --cflags --libs --static opencv4

change the cgo.go files to sth similiar like this (depends on pkg-config output) (be sure to add -static -static-libgcc -static-libstdc++ and -lcomdlg32 -lwinpthread and REMOVE videoio library!)

/*
#cgo !windows pkg-config: opencv4
#cgo CXXFLAGS:   --std=c++11
#cgo windows  CPPFLAGS:   -IC:/opencv/build/install/include
#cgo windows  LDFLAGS:    -LC:/opencv/build/install/x64/mingw/staticlib -LC:/opencv/build/lib -static -static-libgcc -static-libstdc++ -lopencv_gapi451 -lopencv_stitching451 -lopencv_aruco451 -lopencv_bgsegm451 -lopencv_bioinspired451 -lopencv_ccalib451 -lopencv_dnn_objdetect451 -lopencv_dnn_superres451 -lopencv_dpm451 -lopencv_face451 -lopencv_fuzzy451 -lopencv_hfs451 -lopencv_img_hash451 -lopencv_intensity_transform451 -lopencv_mcc451 -lopencv_quality451 -lopencv_rapid451 -lopencv_reg451 -lopencv_rgbd451 -lopencv_saliency451 -lopencv_stereo451 -lopencv_structured_light451 -lopencv_phase_unwrapping451 -lopencv_superres451 -lopencv_optflow451 -lopencv_surface_matching451 -lopencv_text451 -lopencv_tracking451 -lopencv_highgui451 -lopencv_plot451 -lopencv_videostab451 -lopencv_xfeatures2d451 -lopencv_shape451 -lopencv_ml451 -lopencv_ximgproc451 -lopencv_video451 -lopencv_dnn451 -lopencv_xobjdetect451 -lopencv_objdetect451 -lopencv_calib3d451 -lopencv_imgcodecs451 -lopencv_features2d451 -lopencv_flann451 -lopencv_xphoto451 -lopencv_photo451 -lopencv_imgproc451 -lopencv_core451 -llibprotobuf -lzlib -llibjpeg-turbo -llibwebp -llibpng -llibtiff -llibopenjp2 -lquirc -lade -lwsock32 -lcomctl32 -lcomdlg32  -lgdi32 -lole32 -lsetupapi -lws2_32 -lwinpthread
*/
deadprogram commented 3 years ago

@marcown that is very great research.

Can you try the same thing, but instead of deleting the videoio files from GoCV, instead when you build OpenCV try adding the flag -DWITH_FFMPEG=OFF. That might allow VFW or some of the other Windows-specific support already in OpenCV to work.

I think the problem is in part that due to a licensing conflict you cannot link static of FFMPEG on Windows.