【问题标题】:Are C++ libs created with different versions of Visual Studio compatible with each other?使用不同版本的 Visual Studio 创建的 C++ 库是否相互兼容?
【发布时间】:2009-10-21 12:05:25
【问题描述】:

我正在使用 Visual Studio 2005 创建一个开源 C++ 库。我想提供预构建的库以及源代码。这些使用 VS2005 构建的库是否也适用于较新版本的 Visual Studio(尤其是 VS Express Edition 2008)?还是我需要为每个 VS 版本提供单独的库?

【问题讨论】:

  • 不,以我个人的经验,我无法在 2008 年使用 VC6 生成的库。
  • 您是否考虑过提供 DLL 而不是静态库?假设您没有进行“危险”操作(例如客户端代码中的内存分配以及库中相应的释放),客户端可以简单地加载您的库,而不管您使用什么编译器构建它或链接它的库。

标签: c++


【解决方案1】:

不正常,不。使用 VS 工具构建的库链接到提供 C 和 C++ 标准库函数的“Microsoft C 运行时”(称为 MSVCRT,后跟版本号),如果您尝试运行需要此运行时的两个不同版本的程序,那么会发生错误。

最重要的是,不同的编译器版本会产生不同的编译代码,并且一个编译器版本的代码通常与另一个编译器版本不兼容,除非在最微不足道的情况下(如果它们产生相同的代码,那么就会有没有不同的版本没有意义:))

【讨论】:

  • > 如果您尝试运行需要此运行时的两个不同版本的程序,则会出现错误。它对我们有用,我们的一个外部库使用旧的 MSVCRT*.dll
【解决方案2】:

如果您正在分发静态库,则可能能够分发与版本无关的库,具体取决于您正在做什么。如果您只是调用操作系统,那么您可能没问题。 C RTL 函数,也许。但如果您使用任何 C++ 标准库函数、类或模板,则可能不会。

如果分发 DLL,则每个 VS 版本都需要单独的库。有时,您甚至需要针对各种服务包级别使用单独的库。正如 VolkerK 所提到的,您的库的用户必须使用兼容的编译器和链接器设置。即使你做对了所有事情,用户也可能需要链接与你的不兼容的其他库。

由于这些问题,与其花时间尝试为您的用户构建所有这些库,我会花时间让它们尽可能易于构建,以便用户可以轻松地自行构建它们.

【讨论】:

  • 甚至项目设置/编译器标志也可能导致同一编译器版本中的二进制不兼容代码,例如/Zc:wchar_t(默认开启是 VS2005 中的一项重大更改)
【解决方案3】:

通常不可能链接到使用不同编译器、同一编译器的不同版本、甚至同一编译器版本的不同设置构建的库并获得工作应用程序。 (尽管它可能适用于语言和标准库的特定子集。)C++ 没有标准的二进制接口——甚至没有像 C 中那样用于某些通用平台的二进制接口。

要实现这一点,您要么需要将库包装在 C API 中,要么必须为要支持的每个编译器、编译器版本和编译器设置提供一个二进制文件。

【讨论】:

  • GCC 定义了所有版本的 GCC 都使用的标准 ABI。 Intel 的编译器使用相同的 ABI,因此由 intel 编译的库可以被 gcc 使用。但是,正如 workmad3 所述,库和应用程序之间的 MSVCRT 和 glibc 需要相同。
  • @Caspin:是的,但如果不是该 ABI 的双方都使用完全相同版本的 std lib 和他们想要跨越边界的所有其他库,那么即使这样也会失败。这是无数非常难以调试的错误的通行证,这些错误可能只会在某些非常罕见的情况下出现。 BTDT。
【解决方案4】:

如果您的库项目是静态库,那么您必须为您希望用户使用的每个 Visual Studio 版本提供构建。在您给出的示例中,这相当于提供 VS2005 和一个 VS2008 库。

如果您的库项目是动态库,那么您可以在一定程度上规避问题,但这意味着用户需要确保他们使用与您的构建环境兼容的“Microsoft C 运行时”。如果您将“Microsoft C 运行时”静态链接到动态库中,则可以消除该标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-16
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2023-04-01
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多