【问题标题】:Which Visual C/C++ run-time library to pick?选择哪个 Visual C/C++ 运行时库?
【发布时间】:2016-11-11 12:43:13
【问题描述】:

在链接或运行用 C 或 C++ 编写的应用程序时,我偶然发现了错误的 MSVC 运行时问题。因此,我尽量准确地使用正确的版本。

我看到 SDL(简单 DirectMedia 层)库是用 MSVCRT 预编译的,AFAIK 是用 MSVC 4.2 到 6.0 编译的。尽管如此,该预编译库仍适用于我使用后来的 Visual Studio 2015 v14 编译的应用程序。

  1. 为什么将旧 MSVCRT 与 MSVCR140 链接没有问题,例如SDL?
  2. 有没有办法让库与任何更强大的 Visual Studio 编译器兼容?
  3. 如何使用其他编译器解决这个问题,例如GCC 甚至在 Linux 或 Mac 上?

【问题讨论】:

  • 让它成为一个静态库 - 这样你就不会遇到任何包的问题
  • 不过,预编译的 SDL 库怎么没有问题呢?
  • 跨平台库通常从 Unix 开始,使其与许多 Unix 风格兼容是首要问题。并且会支持像 GCC 这样的开源编译器。将其移植到 Windows 通常涉及 MinGW。其中没有编写自己的运行时库,它使用 msvcrt.dll。在程序中加载多个 CRT 副本是非常危险的,必须仔细设计库接口。但 SDL 肯定做对了。与使用 winapi 没有其他区别,它也使用 msvcrt.dll。并且经过精心设计。

标签: c++ linker sdl msvcrt


【解决方案1】:
  1. 因为,我们称它们为老式,运行时被广泛使用,它们总是在那里。但是,较新的 Visual C++ 使用的较新的运行时可能不会自动出现。此外,一段时间以来,Visual C++ 在单个运行时库上进行了标准化,确保了与现有应用程序的向后兼容性。在 Visual Studio 2012 附近的某个地方,这被放弃了,取而代之的是特定于版本的运行时。

  2. 您需要将您的应用程序打包到一个安装程序中,该安装程序还安装必要的运行时(或多个运行时,如果您需要多个)。

  3. Linux 应用程序被打包(RPM、YUM 等),依赖于运行时组件。基本上与 Windows 安装程序相同。依赖项要么是软件包的一部分,要么由发行版满足。 Linux 共享库是版本化的,可以并行安装多个版本,如果需要,应用程序可以链接到特定版本。

【讨论】:

    猜你喜欢
    • 2016-04-16
    • 1970-01-01
    • 2016-07-27
    • 2011-01-09
    • 2012-01-17
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多