出于学习目的,我想创建一个静态库,这是opencv中使用的lib文件的“包”,然后将其链接到我的应用程序“opencvuser”。这样做,我得到了大量的错误。 ( LNK2005 和 LNK2019 )
我的设置:
项目:staticLib
目录。而且我已将所有可用的.lib文件指定为另外的文件
依赖性。 (opencv_core248d.lib,opencv_imgproc248d.lib,opencv_highgui248d.lib,...)Source
项目:opencvuser
我的期望:现在,我应该具有相同的功能,因为我将添加opencv lib文件而不是我的内置 staticLib.lib 是我的期望吗?
到目前为止我检查过的内容:
有人知道静态库上的Runtime-Library设置是否设置为“多线程调试”吗?
最佳答案
之所以会出现这些链接器错误,是因为您尝试使用的OpenCV库是与CRT静态链接的。在您的项目中,您正在动态链接到CRT,这些东西不会混在一起。我建议您不要尝试为所有OpenCV库创建一个“包”,而只是在需要它们的地方链接到所需的特定库。
但我还将向您展示如何解决您的问题:
您可以查看instructions on how to compile OpenCV using CMake and Visual Studio 2010的OpenCV文档。
当您运行CMake时,按下“配置”按钮后,寻找一个名为“BUILD_WITH_STATIC_CRT”的选项并将其禁用。然后,您可以按“生成”,使用VS2010打开解决方案并编译OpenCV。
在“opencvuser”项目配置中,在库管理器下,您需要其他库目录,以将路径添加到所构建的.lib文件所在的位置。对我而言,它位于“c:\ opencv248 \ mybuild \ lib \ Debug \”中。
在“其他依赖项”下,您需要包括所有OpenCV lib文件(opencv_core248d.lib等)。我还需要包含Comctl32.lib和zlibd.lib,因为如果不这样做,我会得到一些链接器错误。
这是我放入的依赖项:
另外,在“opencvuser”项目中,您需要添加一个空的.cpp文件。如果不添加此文件,则解决方案将为空,并且Visual Studio不会对其进行编译。我刚刚在项目中添加了一个名为“dummy.cpp”的文件。该文件是完全空的。不要在其中放入“main()”函数,因为它会与另一个项目中的main函数发生冲突,并且会出现错误。
在“staticlib”项目的“链接器”->“常规”,“其他库”目录下,您需要包括opencvuser.lib文件的路径。对我而言,它是“.. \ debug”。另外,在“链接器”->“输入”,“其他依赖项”下,您需要添加“opencvuser.lib”文件。
您还需要确保以正确的顺序构建项目(首先是opencvuser,然后是staticlib)。为此,请在解决方案上单击鼠标右键,然后选择“属性”。在该窗口的“通用属性”->“项目依赖项”下,确保“opencvuser”不依赖于“staticlib”,但是“staticlib”必须依赖于“opencvuser”。
就是这样,现在您的项目应该可以了。这是两个文件的内容以及正在运行的项目。