using static libraries instead of dynamic libraries in opencv

后端 未结 5 1048
隐瞒了意图╮
隐瞒了意图╮ 2020-12-01 08:31

I have a project in visual studio 2012 which uses opencv dynamic libraries. It compiled, linked and worked well.

I want to change the project so it uses static libra

相关标签:
5条回答
  • 2020-12-01 08:33

    I have build an application which depends on OpenCV 2.4.9 with static linking.

    1) I have just added linker additional dependencies:

    opencv_core249d.lib opencv_imgproc249d.lib opencv_highgui249d.lib opencv_ml249d.lib opencv_video249d.lib opencv_features2d249d.lib opencv_calib3d249d.lib opencv_objdetect249d.lib opencv_contrib249d.lib opencv_legacy249d.lib opencv_flann249d.lib libpngd.lib libtiffd.lib zlibd.lib IlmImfd.lib libjasperd.lib libjpegd.lib comctl32.lib gdi32.lib vfw32.lib

    2) Linker => General => Additional Library Directories => changed $(OPENCV_DIR)\x86\vc12\lib to $(OPENCV_DIR)\x86\vc12\staticlib where OPENCV_DIR is environment variable set to: C:\OpenCV 2.4.9\opencv\build

    3) and changed C/C++ => Code Generation => Multi-threaded debug DLL (MD) to Multi-threaded debug (MTd)

    and enjoyed the successful build.

    the same thing works for release mode (of course link against non-debug libs)

    0 讨论(0)
  • 2020-12-01 08:41

    For Visual Studio 2012 with OpenCV 3.0.0, these problems still apply, and the solutions in this thread are relevant. Here's my setup to get it to work:

    Windows' System Environment Variables

    Set in Windows' System Environment Variables: OPENCV_DIR = D:\OpenCV\build\x64\v11 (replace D:\OpenCV\ with whatever your path to opencv is. Also, x64 for 64-bit machines, x86 for 32-bit machines).

    Use staticlib for AdditionalLibraryDirectories

    Set the Additional Library Directories (View > Property Pages > Configuration Properties > Linker > General > Additional Library Directories) to: $(OPENCV_DIR)\staticlib;%(AdditionalLibraryDirectories)

    Runtime Library

    Change the Code Generation > Runtime Library to Multi-threaded Debug (/MTd) per uosɐſ's answer, otherwise you'll get this kind of error:

    Error   1   error LNK2038: mismatch detected for 'RuntimeLibrary': value
    'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in Source.obj
    C:\Users\...\documents\visual studio 2012\Projects\OpenCVTest2\OpenCVTest2\opencv_core300d.lib(alloc.obj)   OpenCVTest2
    

    Finally, the Additional Dependencies list

    My Additional Dependencies must include all the library names in the staticlib directory. Mind the version numbers; since I'm using OpenCV 3.0.0, the filenames ends with *300d.lib. I believe the comctl32.lib and vfw32.lib are not in the staticlib, but I added them just in case (View > Property Pages > Configuration Properties > Linker > Input > Additional Dependencies):

    opencv_calib3d300d.lib
    opencv_core300d.lib
    opencv_features2d300d.lib
    opencv_flann300d.lib
    opencv_hal300d.lib
    opencv_highgui300d.lib
    opencv_imgcodecs300d.lib
    opencv_imgproc300d.lib
    opencv_ml300d.lib
    opencv_objdetect300d.lib
    opencv_photo300d.lib
    opencv_shape300d.lib
    opencv_stitching300d.lib
    opencv_superres300d.lib
    opencv_ts300d.lib
    opencv_video300d.lib
    opencv_videostab300d.lib
    libtiffd.lib
    libpngd.lib
    libjpegd.lib
    libjasperd.lib
    IlmImfd.lib
    libwebpd.lib
    ippicvmt.lib
    zlibd.lib
    comctl32.lib
    vfw32.lib
    

    x86 vs x64

    I also ran into this issue that VS2012 claims the target machine does not match the module machine type like this guy. The solution is given here.

    0 讨论(0)
  • 2020-12-01 08:42

    I am able to get the static libraries working in VS 2013 by changing the project's Runtime Library to /MTd

    enter image description here

    and then including these Linker >> Input >> Additional Dependencies:

    opencv_core248d.lib
    opencv_imgproc248d.lib
    opencv_highgui248d.lib
    opencv_ml248d.lib
    opencv_video248d.lib
    opencv_features2d248d.lib
    opencv_calib3d248d.lib
    opencv_objdetect248d.lib
    opencv_contrib248d.lib
    opencv_legacy248d.lib
    opencv_flann248d.lib
    libpngd.lib
    libtiffd.lib
    zlibd.lib
    IlmImfd.lib
    libjasperd.lib
    libjpegd.lib
    comctl32.lib
    gdi32.lib
    vfw32.lib
    
    0 讨论(0)
  • 2020-12-01 08:45

    If you are building using CMake then it is very simple because it is one of the OpenCV CMake options; just set BUILD_WITH_STATIC_CRT to off. Eg. on the CMake command-line

    -DBUILD_WITH_STATIC_CRT=OFF
    
    0 讨论(0)
  • 2020-12-01 08:51

    Dude, let me tell you... been there done that.. I tried the static lib thing (a couple of times..) It's evil.

    1. If you are using Visual Studio, you better degrade back to VS2010. VS2012 and up wasn't used to build these libraries. And that is true at least for version 244. You might just be able to link but you will get crashes with very basic functions.. So spare yourself.
    2. If you use GCC you might just find that the .a libs are evil indeed.. They were cross-compiled in windows for LINUX. Trying to link with cygwin, MinGw won't do the job.

    After trying for 2 days I decided that it was enough time wasted, and retreated back to the DLL's, which work ok if you use VS2010.

    Let it not be a turnoff.. If you did manage to link, please share with us all how :)

    0 讨论(0)
提交回复
热议问题