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

Whats the design rationale between GCC exporting all symbols by default vs MSVC not exporting anything by default?

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

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

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

这可能与它们各自 OS 中的可执行文件和库有关。

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

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