【问题标题】:Can a C++ dll compiled using Visual Studio 2008 be used with Visual Studio 2005?使用 Visual Studio 2008 编译的 C++ dll 可以与 Visual Studio 2005 一起使用吗?
【发布时间】:2010-11-16 05:20:42
【问题描述】:

我将使用一个用纯 C++(不是 .NET 也没有 MFC)编写的 C++ 库。该库可使用 Visual Studio 2005 / Intel Fortran 9.1 和 VS 2008 / Intel Fortran 10.1 编译。

显然,我将获取 VS 2008 的二进制文件,因为这是我计算机上的环境,但我很好奇是否有原因导致直接 C++ 库在 VS 2005 和 2008 之间不兼容。我会假设名称修改是相同的,但也许还有其他原因。好久没用C++了,对这些东西有点生疏了。

【问题讨论】:

    标签: c++ windows visual-studio visual-studio-2008 visual-studio-2005


    【解决方案1】:

    您将遇到的最大问题是 CRT 的使用。如果 CRT(C 运行时)静态链接到 DLL,则应该没有任何问题。

    但是,如果 CRT 动态链接到项目中,您可能会遇到麻烦。 Visual Studio 2005 和 2008 使用不同版本的 CRT,它们不容易一起加载。但是,如果一个或两个 DLL 静态链接 CRT,那么您的状态应该不错。

    【讨论】:

    • 谢谢。我发现这篇文章详细介绍了链接msdn.microsoft.com/en-us/library/ms235460.aspx 的一些问题。我拥有的库基本上是一个文件 I/O 库,因此动态链接可能是一个更好的主意(取决于它的使用方式)。
    • 我只是用dumpbin /imports查看了它,该库动态链接到CRT。
    【解决方案2】:

    它应该可以工作。使用 VS 2005 编译的 DLL 将依赖于 VS 2005 的 C 标准库 (msvcr80.dll) 的实现,而您的代码将依赖于 VS 2008 的 C 库 (msvcr90.dll)。这意味着在运行时,两个版本的 C 库都会被加载,这没问题,但它会增加您的内存使用量并且会稍微减慢您的加载时间。

    【讨论】:

    • 这只有在您不尝试修改两个 CRT 库之间的 CRT 对象(内存、文件句柄)时才可以。例如,在 *80.dll 中分配内存并在 *90.dll 中操作它是可以的,但在 *90.dll 中释放它或重新分配它是不行的。调试与发布的行为类似。
    【解决方案3】:

    正如其他发帖人所评论的那样,您应该能够以这种方式工作。

    但是,有一个问题可能很严重 - 内存管理。尤其是 C++ 运行时,可能会很棘手。

    最大的问题是 2005 和 2008 运行时管理内存的方式之间存在一些不兼容。一切正常,只要您始终在 VS2008 DLL 中分配内存,并始终删除从 DLL 中分配的内存。这通常需要在您的 DLL 中创建一些“额外的”工厂和清理方法,并公开这些方法。

    如果您从 VS 2008 DLL 中分配内存,然后从使用 VS 2005 编译的代码中删除它,反之亦然,您可能会遇到一些非常难以调试的问题。它通常可以工作,但会随机崩溃或不稳定。

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 2011-02-22
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多