代码之家  ›  专栏  ›  技术社区  ›  StackedCrooked

C++版本的LIBS是用VisualStudio的不同版本创建的吗?

c++
  •  19
  • StackedCrooked  · 技术社区  · 15 年前

    我使用Visual Studio 2005创建了一个开源C++库。我想提供预构建的libs和源代码。这些libs是用vs2005构建的,是否也将与较新版本的Visual Studio(esp vs Express Edition 2008)一起使用?还是需要为每个vs版本提供单独的libs?

    4 回复  |  直到 8 年前
        1
  •  16
  •   Kristopher Johnson    8 年前

    如果要分发静态库,则可以分发与版本无关的库,具体取决于所做的操作。如果您只是打电话给操作系统,那么您可能没事。可能是C RTL函数。但是,如果使用任何C++标准库函数、类或模板,则可能不使用。

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

    由于这些问题,我没有花时间为您的用户构建所有这些库,而是花时间让它们尽可能容易地构建,这样用户就可以自己构建它们,而不必大惊小怪。

        2
  •  17
  •   workmad3    15 年前

    不正常,没有。用VS工具构建的库链接到“微软C运行时”(称为MSVCRT,后面是版本号),提供C和C++标准库函数,如果您试图运行一个程序,需要两个不同版本的运行时,则会出现错误。

    除此之外,不同的编译器版本会产生不同的编译代码,并且一个编译器版本的代码经常与另一个编译器版本不兼容,除了在最普通的情况下(如果它们产生相同的代码,那么没有必要有不同的版本:)

        3
  •  7
  •   sbi    15 年前

    一般来说,不可能链接到使用不同编译器、同一编译器的不同版本、甚至同一编译器版本的不同设置构建的库,从而获得一个可工作的应用程序。(虽然它可能对语言和STD库的特定子集起作用)但是,C++中没有标准二进制接口——对于C中的某些公共平台甚至没有一个。

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

        4
  •  2
  •   Stephen Quan    8 年前

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

    如果您的库项目是一个动态库,那么您可以稍微回避这些问题,但这意味着用户需要确保他们使用与您的构建环境兼容的“Microsoft C运行时”。如果将“Microsoft C运行时”静态链接到动态库中,则可以消除该条件。