出于学习目的,我想创建一个静态库,opencv中使用的lib文件的“包”,然后将其链接到我的应用程序“opencvuser”。这样做,我得到了大量的错误。 ( LNK2005 和 LNK2019 )
我的设置:
项目:staticLib
项目:opencvuser
我的期望:现在我应该得到相同的功能,因为我会添加opencv lib文件而不是我的内置 staticLib.lib 是我的期望是正确的吗? / p>
到目前为止我检查了什么:
任何人都知道静态库上的Runtime-Library设置是否设置为“多线程调试”?
答案 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,因为如果我没有,我会收到一些链接器错误。
以下是我放入的依赖项:
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”文件。
设置项目依赖项
您还需要确保以正确的顺序构建项目(首先是opencvuser,然后是staticlib)。要执行此操作,请右键单击解决方案,然后选择“属性”。在该窗口中,在Common Properties-> Project dependencies下,确保“opencvuser”不依赖于“staticlib”,但“staticlib”必须依赖于“opencvuser”。
就是这样,现在你的项目应该有效。以下是两个文件的内容,以及正在运行的项目。