在 Visual Studio 中构建 DLL 时使用静态库
Posted
技术标签:
【中文标题】在 Visual Studio 中构建 DLL 时使用静态库【英文标题】:Using a static library when building a DLL in visual studio 【发布时间】:2014-12-23 18:29:28 【问题描述】:我正在尝试使用依赖于 OpenCV 的 Visual Studio 12 社区构建一个 DLL。
我想将 OpenCV 包含为 .lib 文件,因此我不必单独分发它,但我需要将我的文件构建为 DLL。
但我无法将 Visual Studio 配置为将 lib 导入 DLL。如果在
我的项目 -> 属性 -> 配置属性 -> 常规 -> 配置类型,
我选择“静态库(.lib)”并在:
我的项目 -> 属性 -> 配置属性 -> VC++ 目录 -> 库目录,
我选择 OpenCV .lib 文件的路径,并在
我的项目 -> 属性 -> 配置属性 -> 链接器 -> 添加依赖项
我添加了对每个 .lib 的引用,它可以工作。
但如果我将配置类型更改为“动态库 (.dll)”,Visual Studio 会告诉我:
opencv_highgui2410d.lib(window.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in VectorsImport.obj
看来我只能用 .lib 文件制作 .lib 文件。但这似乎不太可能。我已经查过了,但我只找到了有关如何制作 .lib 文件或 .dll 文件或其他文件的指南。这一定很简单,但我无法弄清楚。我习惯了 Linux,其中 .o 可以很容易地包含在 .so 中。这让我很困惑。
【问题讨论】:
从错误来看,opencv.lib是动态链接的,应该使用动态链接。 【参考方案1】:该错误表明您正在尝试将已编译为使用静态 C/C++ 运行时 的 OpenCV 模块与 VectorsImport.obj 模块(可能来自您自己的项目)的调试支持链接, 已编译为使用具有调试支持的动态 C/C++ 运行时。 C 运行时库的四个变体在 Microsoft SDK 中不兼容,因此所有对象文件(来自您的项目或来自静态链接库)都必须匹配该设置。在 Visual Studio 2010 上,可以在 C/C++-Compiler -> Codegeneration -> Runtime library 中找到它。
请注意(如粗体字应强调的那样)OpenCV 不是一个 DLL 或 .lib,但如果 OpenCV 作为单独的 DLL 链接,则允许使用不同类型的 C 运行时库,所以不匹配无关紧要。
【讨论】:
以上是关于在 Visual Studio 中构建 DLL 时使用静态库的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 2012 上构建 dll 版本时需要入口点
在 Visual Studio 中构建时,LoadLibrary 无法加载错误代码 126 的 dll
无法在现代 Windows 上启动 Visual Studio 2008 dll