9

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

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

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

4

1 回答 1

2

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

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

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

于 2015-03-13T18:10:50.100 回答