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

Fer*_*hez 9 c++ gcc visual-c++ msvc12

C++编译器GCC和MSVC之间的许多关键差异之一是,默认情况下,共享库中的所有符号都会被导出,而MSVC则不会导出任何符号.

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

虽然我已经接受了这一点作为生活中的事实,但我想知道每种方法的设计含义,权衡,编译器设计者的角度等等是什么?

Bli*_*ndy 2

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

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

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

  • .so 与 .a 完全不同 (2认同)