LNK2011:为什么LINK.EXE要求stub.obj与预编译头一起链接?

时间:2016-02-15 12:08:05

标签: visual-studio visual-c++ linker linker-errors nmake

在MSDN上阅读这个非常小的解释后,我的问题出现了:

https://msdn.microsoft.com/en-us/library/3ay26wa2.aspx

对于记录,似乎“预编译对象”只是用于创建.pch(预编译头文件)文件的.obj文件。

根据MSDN,您需要将预编译对象与使用它的相应.pch文件的所有其他.obj文件链接在一起。为什么?如果使用/ Yu选项使用CL.EXE编译其他.obj文件,那么它们确实包含.pch对吗?毕竟,在大多数情况下,预编译对象只是一堆预处理器指令......

1 个答案:

答案 0 :(得分:0)

pch远不是一堆预处理程序指令。它更接近于翻译单元中包含(直接或间接)所有类型的前端编译缓存。典型地包含标准标头(例如<windows.h><vector>)最终会导致数百个文件,有时甚至数十万行代码,因此缓存它们的处理非常重要。

例如,如果你将一个#pragma pack的类型编译成一个pch,并将另一个pack(或align)编译成其他翻译单元 - 你会有一个阴险的你手上的错误,因为这些翻译单位不会就对象布局达成一致。

pch的重点是避免生成其他目标文件并包含此信息。在生成一次后,必须与缺少它的所有obj文件链接。