使用不同版本的Visual Studio创建的C++库是否相互兼容?

Sta*_*ked 22 c++

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

wor*_*ad3 18

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

最重要的是,不同的编译器版本会产生不同的编译代码,并且除了最琐碎的情况之外,来自一个编译器版本的代码经常与另一个编译器代码不兼容(并且如果他们生成相同的代码,则没有任何意义不同版本:))


Kri*_*son 16

如果要分发静态库,则可以分发与版本无关的库,具体取决于您正在执行的操作.如果您只是打电话给操作系统,那么您可能没问题.也许是C RTL功能.但是,如果您使用任何C++标准库函数,类或模板,那么可能不会.

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

由于这些问题,我不是花时间尝试为您的用户构建所有这些库,而是花时间让它们尽可能易于构建,以便用户可以自己构建它们,而不用大惊小怪.

  • 甚至项目设置/编译器标志也可能导致同一编译器版本中的二进制不兼容代码,例如/ Zc:wchar_t(默认情况下,它是VS2005中的重大变化) (2认同)

sbi*_*sbi 7

通常,不可能链接到使用不同编译器构建的库,相同编译器的不同版本,甚至相同编译器版本的不同设置,并获得工作应用程序.(虽然它可能适用于语言和std库的特定子集.)C++没有标准的二进制接口 - 甚至没有C语言中的常用平台.

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

  • GCC定义了所有GCC版本使用的标准ABI.英特尔的编译器使用相同的ABI,因此可以使用由intel编译的库.但是,workmad3提到的库和应用程序之间的MSVCRT和glibc需要相同. (2认同)
  • @Caspin:是的,但如果不是该 ABI 的双方都使用完全相同版本的 std lib 和他们想要跨越边界的类型的所有其他库,即使这也会失败。这是无数非常难以调试的错误的门票,这些错误可能只会在某些非常罕见的情况下出现。BTDT。 (2认同)