【问题标题】:Visual Studio 2010 - Create Convenience Static Library OpenCvVisual Studio 2010 - 创建方便的静态库 OpenCv
【发布时间】:2014-03-06 19:46:16
【问题描述】:

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

我的设置:

项目:静态库

  • 我创建了一个没有预编译头文件的静态库应用程序。
  • 在图书管理员下,我已将 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 设置是否设置为“多线程调试”吗?

【问题讨论】:

  • 请先试试这个。 stackoverflow.com/questions/7583172/… 为了能够为静态库编译 OpenCV,需要在 CMake 中配置该选项,然后才能为您生成 Microsoft Visual Studio 解决方案文件。如果您已经生成了这些解决方案文件,将它们更改为静态构建会很麻烦。
  • 我不太明白,我已经在使用 OPENCV 的静态预构建库将其嵌入到我的自定义静态库中。或者你的意思是不同的?谢谢你的评论
  • 据我了解,您首先尝试编译包含所有 OpenCV lib 文件的 staticLib,尝试仅获取一个静态库。然后您尝试引用该文件并使用 OpenCV 函数。我说的对吗?
  • 没错,没错。

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


【解决方案1】:

您收到这些链接器错误是因为您尝试使用的 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”项目配置中,在 Librarian 下,您需要添加其他库目录,以添加您构建的 .lib 文件所在的路径。对我来说,它位于“c:\opencv248\mybuild\lib\Debug\”中。 在 Additional Dependencies 下,您需要包含所有 OpenCV lib 文件(opencv_core248d.lib 等)。我还需要包含 Comctl32.lib 和 zlibd.lib,因为如果我不这样做,我会收到一些链接器错误。

这是我放入的依赖项:

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 directory下,需要包含opencvuser.lib文件的路径。对我来说,它是“..\debug”。另外,在 Linker->Input, Additional Dependencies 下,需要添加“opencvuser.lib”文件。

  • 设置项目依赖

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

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

【讨论】:

  • 首先感谢您的详细回复。我做了几次所有步骤,一次又一次地检查每个点,但是在构建最终应用程序 (staticLib) 时出现错误 ** error LNK2019: unresolved external symbol __imp_CreateToolbarEx referenced in function "int __cdecl icvCreateTrackbar...* (by the方式,我的 staticLib 在你的例子中是 opencvuser ......但我注意到了这一点。)。有什么建议吗?
  • CreateToolbarEx 在 Comctl32.lib 中。您确定在附加依赖项中包含 comctl32.lib 吗? (它应该在所有 opencv .lib 文件旁边)。如果我删除 comctl32.lib,我会得到同样的错误。
  • 添加了,可能是因为我的目标平台是x64?
  • 是的,这可能就是原因。我在 32 位上编译了我的版本,而不是 64 位。我需要进一步调查......
  • 我刚刚使用与上述相同的步骤在 64 位上编译了 OpenCV,并将两个项目转换为 64 位,一切正常。我仍然需要添加对 comctl32.lib 的引用才能使代码正常工作。我把我的项目文件放在pastebin上,请检查一下,看看你使用的是不是和我一样的设置:StaticLib.vcxprojopencvuser.vcxproj
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
相关资源
最近更新 更多