Visual Studio 2010 - 创建便捷静态库OpenCv

时间:2014-03-06 19:46:17

标签: c++ visual-studio-2010 opencv

出于学习目的,我想创建一个静态库,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添加为其他包含目录
  • 然后我在“Properties - > References”
  • 下列出了“staticLib”

我的期望:现在我应该得到相同的功能,因为我会添加opencv lib文件而不是我的内置 staticLib.lib 是我的期望是正确的吗? / p>

到目前为止我检查了什么:

  • 所有项目均为x64
  • Runtime-Library在两个项目中都设置为“多线程调试”

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

enter image description here

1 个答案:

答案 0 :(得分:1)

您正在获取这些链接器错误,因为您尝试使用的OpenCV库与CRT静态链接。在您的项目中,您将动态链接到CRT,这些东西不会混合。我建议您不要尝试创建所有OpenCV库的“包”,而只是链接到您需要的特定库。

但我也会告诉你如何解决问题:

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

    您可以查看instructions on how to compile OpenCV using CMake and Visual Studio 2010的OpenCV文档。 当您运行CMake时,按下“配置”按钮后,查找名为“BUILD_WITH_STATIC_CRT”的选项并禁用它。然后你可以按“生成”,用VS2010打开解决方案并编译OpenCV。

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

    在“opencvuser”项目配置中,在Librarian下,您需要添加其他库目录,以添加您构建的.lib文件所在位置的路径。对我来说,它位于“c:\ opencv248 \ mybuild \ lib \ Debug \”中。 在Additional Dependencies下,您需要包含所有OpenCV lib文件(opencv_core248d.lib等)。我还需要包含Comctl32.lib和zlibd.lib,因为如果我没有,我会收到一些链接器错误。

Librarian settings

以下是我放入的依赖项:

  

opencv_calib3d248d.lib   opencv_contrib248d.lib   opencv_core248d.lib   opencv_features2d248d.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_stitching248d.lib   opencv_superres248d.lib   opencv_ts248d.lib   opencv_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->输入,附加依赖项下,您需要添加“opencvuser.lib”文件。

Linker general Linker input

  • 设置项目依赖项

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

Project dependencies

就是这样,现在你的项目应该有效。以下是两个文件的内容,以及正在运行的项目。

Contents of the two files Project working