与Microsoft相比,如何处理Linux CRunTime库
How is Linux CRunTime library handled compared to Microsoft
我对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++ 库重建最终二进制文件的每个组件。不幸的是,这是没有办法的,因为否则您可能会遇到各种不匹配。这就是为什么许多开源库甚至不关心预制库二进制文件的原因:每个人都需要构建自己的副本,以确保它将正确链接到最终的应用程序代码中。
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- Linux 包管理器如何处理 C++20 个模块?
- Linux 中的信号处理程序使用 sigaction (C++)
- 跨平台套接字发送,Linux 上的缓冲区常量无效* Windows上的常量字符*,最佳处理方式
- 将托管事件处理程序传递给 Linux 中的非托管代码
- 当多个进程尝试同时替换同一文件时,Linux 如何处理这种情况?
- 如何在 c++ linux 中创建事件处理程序
- 如何在 Linux 用户空间中处理类似 GPIO 中断的处理
- Linux x64堆栈在信号处理程序内部展开,以修改返回地址
- 如何解决 Linux 计时器信号处理程序
- 如何用单个信号处理程序解决这个多linux定时器的问题
- 访问linux的OpenCV-2.4.3的OPENCV图像处理库
- 在Linux和Windows C 上处理的低级文件操作
- Linux上的静态Qt5构建:部署时如何处理字体
- OSX vs Linux:如何处理未签名的长和uint64_t
- 处理 Linux 上的库依赖关系
- 与Microsoft相比,如何处理Linux CRunTime库
- 既然Qt3D说支持Linux,我该如何处理Linux上缺少window.h的问题
- 哪个c/c++库可以用来处理linux的wifi连接
- c++处理Linux多线程程序中的按键操作