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

我的设置:

项目:staticLib

  • 我创建了一个没有预编译头的静态库应用程序。
  • 在图书管理员下,我将D:\ OpenCV248 \ build \ x64 \ vc10 \ staticlib作为附加库
    目录
    。而且我已将所有可用的.lib文件指定为另外的文件
    依赖性
    。 (opencv_core248d.lib,opencv_imgproc248d.lib,opencv_highgui248d.lib,...)Source

  • 项目:opencvuser
  • 我添加了C:\ OpenCV240 \ build \ include作为其他包含目录
  • 然后我在“属性->引用”下列出了“staticLib”

    我的期望:现在,我应该具有相同的功能,因为我将添加opencv lib文件而不是我的内置 staticLib.lib 是我的期望吗?

    到目前为止我检查过的内容:
  • 所有项目均为x64
  • 在两个项目中,将
  • Runtime-Library设置为“多线程调试”。

  • 有人知道静态库上的Runtime-Library设置是否设置为“多线程调试”吗?

    最佳答案

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

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

  • 您需要重新编译OpenCV,而无需静态链接到CRT。

    您可以查看instructions on how to compile OpenCV using CMake and Visual Studio 2010的OpenCV文档。
    当您运行CMake时,按下“配置”按钮后,寻找一个名为“BUILD_WITH_STATIC_CRT”的选项并将其禁用。然后,您可以按“生成”,使用VS2010打开解决方案并编译OpenCV。
  • 在VS2010项目中,使用以下设置:

    在“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”。


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

    10-06 01:53