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 错误?