C++ 库打包的运行时兼容性

C++ 库打包的运行时兼容性,c++,visual-studio,compatibility,nuget-package,msvcrt,C++,Visual Studio,Compatibility,Nuget Package,Msvcrt,我想将库打包为NuGet本机包。这个问题并不特定于打包的lib/dll/pdb/includes的分发方式;但具体地说,我正在看(我希望有更好的链接),我得到了一个印象,有太多不同的构建目标,通过组合获得。我试图提出一个或多或少最小的目标集,供依赖于包的应用程序使用。构建目标主要有以下正交轴: 32位对64位。显然,这是合法的 动态与静态构建。这也是合理的 调试与发布版本。这也很有意义,因为调试构建引用调试运行时(libcmtd.lib或msvcdrtd.lib),而发布构建引用静态运行时(li

我想将库打包为NuGet本机包。这个问题并不特定于打包的lib/dll/pdb/includes的分发方式;但具体地说,我正在看(我希望有更好的链接),我得到了一个印象,有太多不同的构建目标,通过组合获得。我试图提出一个或多或少最小的目标集,供依赖于包的应用程序使用。构建目标主要有以下正交轴:

  • 32位对64位。显然,这是合法的
  • 动态与静态构建。这也是合理的
  • 调试与发布版本。这也很有意义,因为调试构建引用调试运行时(
    libcmtd.lib
    msvcdrtd.lib
    ),而发布构建引用静态运行时(
    libcmtd.lib
    msvcdrtd.lib
    )。为了避免默认库冲突,包含这些内容是有意义的
  • 以上这些无疑是很好的轴心。下一个问题值得商榷,尽管在许多例子中都有:

  • \u cdecl
    vs
    \u stdcall
    vs
    \uu fastcall
    vs
    \uu thiscall
    。我认为这没有什么意义。无论其他链接库如何,此特定库都支持调用约定。此外,变量参数仅适用于Win32中的
    \u cdecl
    ,并且还支持64位调用约定。我的理解是,只要头文件声明与平台兼容的调用约定,我选择的任何内容都可以。在任何情况下,都不会为不同的调用约定提供Microsoft运行时库
  • 下一个我不知道该怎么处理。同样,示例声明

  • 库由不同的工具集构建,这些工具集随Visual Studio版本的不同而不同:从
    v100
    (v10.0,VS 2010)到
    vs140
    (v14.0,VS 2015)。我的主要问题是,运行库在不同的Visual C++库之间兼容如何?这里的问题是我们也使用其他工具集(英特尔C++是一个例子),这些通常在COAPP中没有对应的包装案例,而与微软运行时兼容。 我希望避免为特定的工具集打包。如果代码使用最旧的vesrion编译,并且不使用任何更新的运行时函数(例如,v110是受支持的最低版本),那么这有多可能?我在这里主要担心两件事(对不起,另一个编号列表从这里开始):

  • 如果我用VS 2012编译一个静态库(提供位、静态性和调试性匹配),我能在VS2013中链接它吗(its
    libcmt[d].lib
  • 在同样的条件下,我是否能够在VS2010中链接到它
  • 同样的两个问题,但说到共享的DLL运行时
  • 同样的问题,但考虑到运行库定义的异常,这些异常可能由库抛出:will e。g
    std
    异常在编译器的版本链上下兼容,前提是我在启用RTTI的情况下编译库 更一般地说,是否有Microsoft提供的运行时兼容性矩阵

    如果还有其他编号的列表点,我也想听听