在 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

为较低版本的 Visual Studio 构建 .dll

无法在现代 Windows 上启动 Visual Studio 2008 dll

在 Visual Studio 2017 中使用 Cmake 构建 ssh.dll

在 Qt 中构建 DLL 并在 Visual Studio+Del​​phi 中使用