gpt4 book ai didi

c++ - GCC 默认导出所有符号与 MSVC 默认不导出任何内容之间的设计原理是什么?

转载 作者:可可西里 更新时间:2023-11-01 16:42:21 24 4
gpt4 key购买 nike

C++ 编译器 GCC 和 MSVC 之间的许多关键区别之一是,首先默认导出共享库中的所有符号,而 MSVC 不导出任何内容。

一些含义是,在 MSVC 中,您必须导出显式实例化的模板类。

虽然我已经接受了这一事实,但我想知道从编译器设计人员的角度来看,每种方法的设计含义、权衡是什么?

最佳答案

这可能与各自操作系统中的可执行文件和库有关。

在 Windows 上,库 (DLL) 和可执行文件是一回事。从字面上看,您可以将 .dll 重命名为 .exe,它将运行保护模式 stub 并输出一些错误(再次强调,保护模式,因此它只能在 16 位系统上运行)。鉴于它们是相同的,并且您可以(并且确实!)从实际可执行文件中导出符号,您会期望默认设置为不导出任何内容吗?

然而,在 Linux 上,可执行文件是它们自己的东西,代码库(共享对象,.so)是另外一回事。事实上 .so 文件更接近文件(.a,某种 gcc 库——但实际上不是文件)如果我没记错的话。不需要像在 Windows 中那样包含 .lib 来使用共享库,因为它某种库文件。鉴于您明确地将输出编译为这个共享库,我真的没有看到它默认导出所有内容有什么奇怪的。

关于c++ - GCC 默认导出所有符号与 MSVC 默认不导出任何内容之间的设计原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29038914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com