c++ 在opencv中使用静态库而不是动态库

f87krz0w  于 11个月前  发布在  其他
关注(0)|答案(5)|浏览(106)

我在visual studio 2012中有一个使用opencv动态库的项目。它编译,链接和运行良好。
我想更改项目,使其使用静态库而不是动态库。
我将项目VC++目录中的库目录从

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

字符串
致:

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


但是当我想构建项目时,我得到了很多链接器错误,例如:

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


更重要的是,还有很多错误,比如:

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)


要将使用动态库的项目转换为使用静态库,还应该做哪些更改?

编辑1

在将/md更改为/mt并将一些新库添加到输入库列表中之后:

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


我发现了一些新的错误:

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)


似乎有一个图书馆不见了,但是是哪一个呢?

编辑2需要添加更多的库到列表中。完整的库列表如下:

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


这就解决了问题。

qni6mghb

qni6mghb1#

我可以通过将项目的JavaScript库更改为/MTd来使静态库在VS 2013中工作
x1c 0d1x的数据
然后包括这些链接器>>输入>>附加说明:

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

字符串

3bygqnnd

3bygqnnd2#

如果你正在使用CMake进行构建,那么它非常简单,因为它是OpenCV CMake选项之一;只需在CMake命令行上将BUILD_WITH_STATIC_CRT设置为off。

-DBUILD_WITH_STATIC_CRT=OFF

字符串

knpiaxh1

knpiaxh13#

对于使用OpenCV 3.0.0的Visual Studio 2012,这些问题仍然适用,并且此线程中的解决方案是相关的。下面是我的设置,以使其工作:

Windows系统环境变量

在Windows的系统环境变量中设置:OPENCV_DIR = D:\OpenCV\build\x64\v11(将D:\OpenCV\替换为您的opencv路径。此外,x64用于64位机器,x86用于32位机器)。

使用staticlib实现AdditionalLibraryDirectory

将其他库目录(查看>属性页>配置属性>链接器>常规>其他库目录)设置为:$(OPENCV_DIR)\staticlib;%(AdditionalLibraryDirectories)

云计算库

将Code Generation(代码生成)> EQUIPMENT Library(编译库)更改为Multi-threaded Debug (/MTd) per uosɐſ's answer,否则您将得到这种错误:

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

字符串

最后,添加附加权限列表

我的附加目录必须包括staticlib目录中的所有库名称。* 注意版本号 *;由于我使用OpenCV 300,文件名以 *300d.lib结尾。我相信comctl32.libvfw32.lib不在静态库中,但我添加了它们以防万一(查看>属性页>配置属性>链接器>输入>其他配置):

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

我还遇到了这个问题,VS 2012声称目标机器不匹配模块机器类型,如this guy。解决方案是here

gtlvzcf8

gtlvzcf84#

伙计,让我告诉你……在那里做过……我试过静态库的东西(几次……)它是邪恶的。
1.如果你使用的是Visual Studio,你最好降级到VS2010。VS2012和更高版本并没有被用来构建这些库。至少对于244版本来说是这样的。你可能只是能够链接,但你会在非常基本的功能上崩溃。。所以省省吧。
1.如果你使用GCC,你可能会发现.a库确实是邪恶的..它们在Linux的windows中交叉编译。试图与cygwin链接,MinGw不会做这项工作。
在尝试了2天后,我决定浪费足够的时间,并退回到DLL的,如果你使用VS2010,它可以正常工作。
不要让它成为一个关闭。.如果你确实设法链接,请与我们分享如何:)

yhqotfr8

yhqotfr85#

我构建了一个依赖于OpenCV 2.4.9的静态链接的应用程序。
1.我刚刚添加了链接器附加依赖项:

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

字符串

  1. Linker => General => Additional Library Directories =>将$(OPENCV_DIR)\x86\vc12\lib更改为$(OPENCV_DIR)\x86\vc12\staticlib,其中OPENCV_DIR是设置为C:\OpenCV 2.4.9\opencv\build的环境变量
    1.并将C/C++ =>代码生成=>多线程调试DLL(MD)更改为多线程调试(MTd)
    并享受成功的建设。
    同样的事情也适用于发布模式(当然是针对非调试库的链接)

相关问题