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



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

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

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

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

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

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

pch 的全部意义在于避免生成其他对象文件并包含此信息。在生成一次后,它必须与所有缺少它的obj文件链接。

最新更新