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

标签 c++ visual-studio-2010 opencv

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

我的设置:

项目:静态库

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

项目:opencvuser

  • 我添加了 C:\OpenCV240\build\include 作为附加包含目录
  • 然后我在“Properties -> References”下列出了“staticLib”

我的期望:现在我应该获得相同的功能,因为我会添加 opencv lib 文件而不是我构建的 staticLib.lib 我的期望是否正确?

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

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

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

enter image description here

最佳答案

您收到这些链接器错误是因为您尝试使用的 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\”中。 在附加依赖项下,您需要包含所有 OpenCV 库文件(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 directories 下,您需要包含 opencvuser.lib 文件的路径。对我来说,它是“..\debug”。此外,在 Linker->Input,Additional Dependencies 下,您需要添加“opencvuser.lib”文件。

Linker general Linker input

  • 设置项目依赖

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

Project dependencies

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

Contents of the two files Project working

关于c++ - Visual Studio 2010 - 创建便捷静态库 OpenCv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22234416/

相关文章:

c++ - 在构造函数 C++ 中创建指向对象的指针

c++ - IWebBrowser2 问题 - 如何在新窗口中打开文档?

.net - Visual C++ 秒表

windows - 在计算模拟器下启动 Azure Web 角色时出现 "No endpoint listening"

java - 如何使用 OpenCV Java 转换矩阵中的矩形颜色 (ROI)?

python - python OpenCV输出列表

opencv - 无法将4个数字加到mat opencv

java - 如何在 Android 应用程序中显示不支持(格式)的图像?

c++ - 为什么需要空构造函数?

visual-studio-2010 - 获取使用 C# Process.Start 启动的程序的进程 ID