C++ Visual Studio 2010-创建方便的静态库OpenCv

C++ Visual Studio 2010-创建方便的静态库OpenCv,c++,visual-studio-2010,opencv,C++,Visual Studio 2010,Opencv,出于学习目的,我想创建一个静态库,一个opencv中使用的lib文件的“包”,然后将其链接到我的应用程序“opencvuser”。这样做,我得到了大量的错误。(LNK2005和LNK2019) 我的设置: 项目:staticLib 我创建了一个没有预编译头的静态库应用程序 在library下,我将D:\OpenCV248\build\x64\vc10\staticlib作为一个附加库 目录。我已经将所有可用的.lib文件指定为附加文件 依赖项。(opencv_core248d.lib、open

出于学习目的,我想创建一个静态库,一个opencv中使用的lib文件的“包”,然后将其链接到我的应用程序“opencvuser”。这样做,我得到了大量的错误。(LNK2005LNK2019

我的设置:

项目:staticLib

  • 我创建了一个没有预编译头的静态库应用程序
  • 在library下,我将D:\OpenCV248\build\x64\vc10\staticlib作为一个附加库 目录。我已经将所有可用的.lib文件指定为附加文件 依赖项。(opencv_core248d.lib、opencv_imgproc248d.lib、opencv_highgui248d.lib等)
项目:opencvuser

  • 我已经添加了C:\OpenCV240\build\include作为一个附加的include目录
  • 然后我在“属性->引用”下列出了“staticLib”
我的期望:现在我应该得到同样的功能,因为我会添加opencv库文件,而不是我构建的staticLib.lib我的期望正确吗

到目前为止我检查的内容:

  • 所有项目均为x64
  • 两个项目中的运行库都设置为“多线程调试”
有人知道静态库上的运行时库设置是否设置为“多线程调试”吗


您收到这些链接器错误,因为您尝试使用的OpenCV库是针对CRT静态链接的。在您的项目中,您正在动态链接到CRT,这些东西不会混合在一起。我建议您不要试图创建一个包含所有OpenCV库的“包”,而只是在需要它们的地方链接到所需的特定库

但我还将向您展示如何解决您的问题:

  • 您需要在不静态链接到CRT的情况下重新编译OpenCV

    您可以查看OpenCV文档以了解更多信息。 运行CMake时,在按下“配置”按钮后,查找名为“使用静态CRT构建”的选项并将其禁用。然后您可以按“生成”,用VS2010打开解决方案并编译OpenCV

  • 在VS2010项目中,使用以下设置:

    在“opencvuser”项目配置中,在library下,需要添加其他库目录,以添加生成的.lib文件所在的路径。对我来说,它位于“c:\opencv248\mybuild\lib\Debug\”中。 在附加依赖项下,需要包含所有OpenCV库文件(OpenCV_core248d.lib等)。我还需要包括Comctl32.lib和zlibd.lib,因为如果我不这样做,我会得到一些链接器错误

以下是我输入的依赖项:

opencv_calib348; d248d.lib opencv_contrib248d.lib opencv_core248d.lib opencv_功能2D248D.lib opencv_flann248d.lib opencv_gpu248d.lib opencv_haartraining_engined.lib opencv_highgui248d.lib opencv_imgproc248d.lib opencv_legacy248d.lib opencv_ml248d.lib opencv_nonfree248d.lib opencv_objdetect248d.lib opencv_ocl248d.lib opencv_photo248d.lib opencv_缝合248D.lib opencv_superres248d.lib opencv_ts248d.lib opencv\u video248d.lib opencv_videostab248d.lib Comctl32.lib zlibd.lib

此外,在“opencvuser”项目中,您需要添加一个空的.cpp文件。如果不添加此文件,解决方案将为空,Visual Studio将不会编译它。我刚刚在项目中添加了一个名为“dummy.cpp”的文件。那个文件完全是空的。不要在其中放入“main()”函数,因为它会与另一个项目中的main函数发生冲突,您将得到一个错误

在“staticlib”项目中,在Linker->General,Additional library目录下,您需要包括opencvuser.lib文件的路径。对我来说,是“.\debug”。另外,在Linker->Input,Additional Dependencies下,您需要添加“opencvuser.lib”文件

  • 设置项目依赖项

    您还需要确保以正确的顺序构建项目(首先是opencvuser,然后是staticlib)。为此,右键单击解决方案并选择“属性”。在该窗口中,在公共属性->项目依赖项下,确保“opencvuser”不依赖于“staticlib”,但“staticlib”必须依赖于“opencvuser”

就这样,现在您的项目应该可以工作了。下面是两个文件的内容,以及正在运行的项目


请先试试这个。为了能够为静态库编译OpenCV,需要在CMake中配置该选项,然后才能为您生成Microsoft Visual Studio解决方案文件。如果您已经生成了这些解决方案文件,那么将它们更改为静态构建将是一件很麻烦的事情。我真的不明白,我已经在使用OPENCV的静态预构建库将其嵌入到我的自定义静态库中。或者你的意思不同?根据我的理解,您首先尝试编译包含所有OpenCV库文件的staticLib,尝试只获取一个静态库。然后尝试引用该文件并使用OpenCV函数。我说得对吗?没错。首先感谢你的详细回复。我把所有的步骤都做了好几次,一次又一次地检查每一点,但是在构建最终的应用程序(staticLib)时,我得到了错误**错误LNK2019:未解析的外部符号uuu imp_CreateToolbarEx在函数“int u cdecl icvCreateTrackbar…”中引用(顺便说一句,我的staticLib在您的示例中是opencvuser…,但我注意到了这一点。)。有什么建议吗?CreateToolbarEx位于Comctl32.lib中。您确定在其他依赖项中包含了Comctl32.lib吗?(它应该位于所有opencv.lib文件的旁边)。如果删除comctl32.lib,我也会遇到同样的错误。这是添加的,可能是因为我的目标平台是x64?是的,这可能是原因。我在32位上编译了我的版本,而不是64位。我需要进一步调查……我刚刚编译了OpenCV o