Linker fatal error: LNK1102: out of memory

在32位程序的持续集成中遇到Linker fatal error: LNK1102: out of memory问题。尝试通过设置PreferredToolArchitecture为x64来解决,但未成功。最终解决方案是在msbuild环境中指定amd64_x86参数,确保使用64位工具链编译x86目标,从而避免内存溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象

在持续集成流水线中用msbuild编译32位的程序偶先报错:Linker fatal error: LNK1102: out of memory。

一般解决方法

谷歌之后找到了微软的官方文章,里面写了产生这个问题的原因和解决方法:https://support.microsoft.com/en-us/help/2891057/linker-fatal-error-lnk1102-out-of-memory
解释:大概意思就是,link的时候申请的堆空间太大了,exe虚拟地址空间都不够了,推荐设置PreferredToolArchitecture=x64来使用64位的编译工具。
但是改了各种地方:
(1)环境变量
(2)$(VCTargetsPath)\Microsoft.Cpp.Default.props里面加上PreferredToolArchitecture属性并设置为x64
(3)在经常出错的vcxproj中加上PreferredToolArchitecture属性并设置为x64。
都不好使,郁闷

我的解决方法

最后发现,在我们的持续集成流水线中我们是这样设置msbuild环境的:

%comspec% /k ““C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat”” x86

查看这个批处理:
在这里插入图片描述
发现了很多不同的工具集架构,他们的区别如下:
在这里插入图片描述</

### 解析 LNK1104 错误 LNK1104 是 Microsoft Visual Studio 链接器报告的一种常见错误,表示无法找到指定的库文件或目标文件。这类问题通常发生在项目配置不正确、路径设置有误或是权限不足的情况下。 #### 原因分析 该类错误可能由多种因素引起: - **文件缺失**:所需的目标文件确实不存在于预期位置。 - **路径配置不当**:尽管文件存在,但由于路径未被正确添加到项目的链接选项中而未能访问。 - **权限问题**:尝试写入受保护的位置时可能会遇到此问题[^4]。 - **环境变量配置失误**:某些情况下,依赖项通过全局环境变量来定位,如果这些变量指向了错误的地方也会引发此类错误[^2]。 #### 解决方案概述 针对上述原因,可以采取如下措施解决问题: 对于 `fatal error LNK1104: cannot open file` 的情况,建议按照以下方式排查并修正: #### 方法一:确认文件是否存在及其位置 确保所需的 `.lib`, `.dll` 或其他类型的二进制文件存在于计算机上,并位于正确的目录内。例如,在引用[3] 中提到的是关于 `glut32.lib` 文件的问题;此时应先验证这个特定版本的GLUT库是否已下载并放置到了适当的位置。 #### 方法二:调整项目属性中的附加库目录 进入Visual Studio IDE, 打开受影响项目的属性页 (通常是右键点击解决方案资源管理器里的项目名 -> 属性),导航至 "Linker"->"General", 将缺少的静态库所在的绝对路径加入到“Additional Library Directories”字段里。 ```cpp // 示例代码展示如何在CMakeLists.txt中添加额外的库路径 set(CMAKE_CXX_STANDARD 17) target_link_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/libs) ``` #### 方法三:检查输出路径与其他构建参数 当创建新的工程项目时,避免将其置于IDE本身的安装目录之下,因为这可能导致读取/写入权限上的冲突。另外还需注意调试(Debug)/发布(Release)模式下的不同输出设定,保证最终生成物能够顺利存放到期望地点而不发生覆盖或其他干扰行为。 #### 方法四:更新工具链与清理缓存 有时旧版编译器可能存在Bug或者兼容性问题,因此考虑升级到最新稳定版本可能是必要的。同时记得清除之前的中间产物以及重建整个解决方案以排除潜在残留影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值