与Microsoft相比,如何处理Linux CRunTime库

How is Linux CRunTime library handled compared to Microsoft

本文关键字:处理 Linux CRunTime 相比 Microsoft 何处理      更新时间:2023-10-16

我对Microsoft的CRT有很多概念问题。 对于任何项目,您必须编译所有必需的库以链接到相同版本的 CRT。

第一个问题是当您的项目静态链接到 CRT (/MT) 时。 然后,所有依赖库也必须静态链接自己的 CRT。 所以每个库都有自己的版本 - 例如 - malloc()。 如果您去年在系统 A 上编译了其中一个库,则该 CRT 版本可能与您当前在另一个系统 B 上使用的服务包 3+ 版本不同。 因此,如果要释放库分配的对象,则可能会遇到问题。

因此,动态链接的CRT似乎是要走的路(/MD)。 使用 dll,所有库都将在系统上获得 CRT 的当前实现。 除了Microsoft的并排机制,情况并非如此。 相反,你将获得标记在编译的库上的 CRT 版本,并将该版本的 DLL 提供给该库。 因此,可能会出现我之前描述的完全相同的问题。 一年前,您针对一个 CRT 在系统 A 上编译了一个库。 一年后,有一个新版本升级。 您的主程序获取具有一个版本的 CRT 的 DLL,库使用另一个版本的 CRT 获取 DLL,可能会出现相同的问题。

那你怎么办? 我意识到跨库内存分配是不受欢迎的。 但是你可以忽略malloc的例子,想出另一个例子。 您是否让每个开发人员重新编译其计算机上的每个依赖库,以确保所有内容都使用相同的 CRT? 然后对于版本,您再次重新编译每个库?

这在 Linux 上是如何工作的? 这是我的主要兴趣。 是否有 GCC 随附的 CRT 或 Linux 系统本身附带 CRT 库? 我从未见过在Makefils中明确链接的CRT。

在 Linux 上,动态库链接到什么 CRT? 机器上最新的一个,还是更"并排"的机制。

在Linux方面,我认为标准库有两个基本部分存在问题: 我们有C-runtime部分,它应该永远与ABI兼容。实际上,无论最终链接时链接哪个版本都应该没问题,如果它是兼容性所需的旧版本,您可以使用二进制文件重新分发任何所需的共享库。通常,这些库只是并排位于 *NIX 系统上。

其次,你有C++库。这些几乎可以保证以任何方式不兼容 ABI,因此您必须针对相同版本的 C++ 库重建最终二进制文件的每个组件。不幸的是,这是没有办法的,因为否则您可能会遇到各种不匹配。这就是为什么许多开源库甚至不关心预制库二进制文件的原因:每个人都需要构建自己的副本,以确保它将正确链接到最终的应用程序代码中。