Visual Studio 2008 中的 LNK1210

Posted

技术标签:

【中文标题】Visual Studio 2008 中的 LNK1210【英文标题】:LNK1210 in Visual Studio 2008 【发布时间】:2011-12-13 22:04:07 【问题描述】:

我在链接 Chromium 项目时收到以下错误:

Linking...
LINK.EXE.SUPALINK_ORIG : ..\build\Debug\chrome.dll not found or not built by the last incremental link; performing full link
   Creating library ..\build\Debug\lib\chrome_dll.lib and object ..\build\Debug\lib\chrome_dll.exp
LINK.EXE.SUPALINK_ORIG : fatal error LNK1210: exceeded internal ILK size limit; link with /INCREMENTAL:NO

VS2005 有一个similar question。不知何故,这很奇怪,因为链接器已经在做完整的链接。设置/INCREMENTAL:NO时链接成功,但增量链接被禁用。

有没有办法增加 ILK 大小限制以启用增量链接?

【问题讨论】:

【参考方案1】:

根据 Microsoft 的消息,ILK 的大小有一些硬性限制,但它确实会随着 VS 版本和操作系统环境的不同而有所不同:

VS2005 的 ILK 文件限制为 256MB VS2008 在现有 Win32 操作系统上的 ILK 文件限制为 256MB,或 如果在带有/3GB option used 的 Win32 操作系统上运行,则限制为 384MB,或者 如果您在 Win64 操作系统上运行,则限制为 768MB

来源:This MS Connect incident record,其中还提到了使用 /3GB 时可能需要考虑的一些缺点。

由于您在 Win64 操作系统上运行(根据您的评论),我认为您可能会获得最大的 ILK 文件大小限制。 /3GB 选项仅适用于 32 位操作系统安装 - 在 WoW64 32 位“大地址感知”应用程序下运行时,可以获得完整的 4GB 地址空间 - 不需要 /3GB 选项。

但是等等 - 我有一个想法(可能是一个轻率的想法)。我不知道这是否真的可以解决您遇到的增量链接问题,即使可以,它仍然可能不值得,因为它可能会带来很多麻烦,尤其是在维护方面:

您可能想看看使用 x64 本机链接器是否可以解决该问题 - 如果您安装 x64 编译器选项,VS 会为 x86/x64 目标和 x86/x64 主机的各种组合安装几组编译器/链接工具平台。就编译器而言,要生成 x86 代码,只有 Win32 编译器,但要生成 x64 代码,则需要 Win64 编译器和 Win32“交叉编译器”工具链。但是,对于链接器,似乎任何一个链接器(Win32 或 Win64 - 链接器的“交叉”版本只是 Win32 版本的副本)都可以生成 x86 或 x64 目标。

如果本机 Win64 链接器可以处理比本机 Win32 链接器更大的 ILK 文件,我不会感到太惊讶,因此如果您当前的构建过程使用 Win32(或 Win32 'cross')可能值得测试工具。

如果您的目标是 x64,请确保您的构建过程使用 VC\bin\amd64 中的原生 x64 工具,而不是 VC\bin\x86_amd64 中的交叉工具。如果您使用常规的 VS IDE C++ 项目来构建,您可能必须切换到 makefile 项目以强制使用本机 x64 工具。

如果您的目标是 x86,事情可能会有点棘手 - 构建的编译阶段需要使用 VC\bin 中的 x86 工具,但是对于链接阶段,您需要使用 x64 本机VC\bin\amd64 中的链接器。指定 /machine:x86 选项并确保您已将库搜索路径设置为查找 x86 库而不是 x64 库。这有效 - 至少对于一个小型测试程序。但我喜欢我说的,我不知道它是否真的有助于解决您遇到的增量链接问题,或者即使这样做也值得。

【讨论】:

不幸的是,/3G 启动开关在我的操作系统(Windows 7 64 位)上不受支持。有没有其他方法可以增加 ILK 的大小? 我认为我引用的第一篇文章可能会混淆一些信息,所以我更新了答案。不幸的是,如果您在 64 位操作系统上运行,我认为您可能会达到上限。但我也提出了一个非常长远的可能性的想法。 感谢您提供的信息量很大的帖子。老实说,我已经以不同的方式解决了一个问题(将我的应用程序分成几个 DLL,每个 DLL 分别链接),所以这不再相关,但我从你的帖子中学到了很多 - 我会标记它作为答案。也许如果我以后有时间 - 我会检查这是否也解决了 ILK 大小限制。 看起来还有更多内容,至少对于 MSVC 2015 而言。今天早上我开始遇到这个问题,但我们的自动化夜间构建没有。两个系统都是 64 位的,使用 64 位工具构建。 啊哈!一位同事发现链接器标志 /MAXILKSIZE:0x7ff00000,它将 ILK 设置为尽可能大。这解决了 MSVC2015 的问题。

以上是关于Visual Studio 2008 中的 LNK1210的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2005 中的错误 LNK1201

什么会导致 Visual Studio 中的 LNK2019 错误?

似乎无法忽略 Visual Studio 2010 中的库

Visual Studio 错误 LNK2005

Visual Studio 2019 CVT1101 & LNK1123 致命错误

opencv/visual studio:错误 LNK2019:未解析的外部符号