using static libraries instead of dynamic librarie

2019-01-08 19:04发布

问题:

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 libraries instead of dynamic libraries.

I changed the library directories in project VC++ directory from

  C:\thirdparty\opencv\build\x86\vc11\lib

to: C:\thirdparty\opencv\build\x86\vc11\staticlib

but when I want to build the project, I am getting a lot of linker error such as:

 Error  110 error LNK2001: unresolved external symbol _TIFFWriteScanline    myproject\opencv_highgui245.lib(grfmt_tiff.obj) 

and more importantly a lot of error such as this:

 Error  1   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in myproject.obj    myproject\opencv_core245.lib(system.obj)    

What other changes should I do to convert a project which uses dynamic libraries to use static libraries?

Edit 1

After change /md to /mt and adding some new libraries to the list of input libraries:

opencv_calib3d245.lib
opencv_contrib245.lib
opencv_core245.lib
opencv_features2d245.lib
opencv_flann245.lib
libtiff.lib
libpng.lib
libjpeg.lib
libjasper.lib
IlmImf.lib
zlib.lib
opencv_gpu245.lib
opencv_haartraining_engine.lib
opencv_highgui245.lib
opencv_imgproc245.lib
opencv_legacy245.lib
opencv_ml245.lib
opencv_nonfree245.lib
opencv_objdetect245.lib
opencv_photo245.lib
opencv_stitching245.lib
opencv_ts245.lib
opencv_video245.lib
opencv_videostab245.lib

I am getting some new errors:

Error   9   error LNK2001: unresolved external symbol _AVIFileCreateStreamA@12  myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   8   error LNK2001: unresolved external symbol _AVIFileGetStream@16  myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   5   error LNK2001: unresolved external symbol _AVIFileInit@0    myproject\opencv_highgui245.lib(cap_vfw.obj)    
Error   7   error LNK2001: unresolved external symbol _AVIFileOpenA@16  myproject\opencv_highgui245.lib(cap_vfw.obj)    

Apparently some library is missing, but which one?

Edit 2 need to add more library to list. Full list of library is as follow:

opencv_calib3d245.lib
opencv_contrib245.lib
opencv_core245.lib
opencv_features2d245.lib
opencv_flann245.lib
libtiff.lib
libpng.lib
libjpeg.lib
libjasper.lib
IlmImf.lib
zlib.lib
opencv_gpu245.lib
opencv_haartraining_engine.lib
opencv_highgui245.lib
opencv_imgproc245.lib
opencv_legacy245.lib
opencv_ml245.lib
opencv_nonfree245.lib
opencv_objdetect245.lib
opencv_photo245.lib
opencv_stitching245.lib
opencv_ts245.lib
opencv_video245.lib
opencv_videostab245.lib
Vfw32.Lib
comctl32.lib

This solved the problem.

回答1:

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

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


回答2:

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


回答3:

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.



回答4:

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 :)



回答5:

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)