还有以下错误(严重性 代码 说明 项目 文件 行 禁止显示状态 错误(活动) E0035 #error 指令: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] SPiiPlusCLibraryDemo D:\VS2019\VC\Tools\MSVC\14.29.30133\atlmfc\include\afx.h 24 )
时间: 2025-08-18 21:22:33 浏览: 2
<think>我们面对两个独立但可能相关的问题:
1. LNK1112: 模块计算机类型“x86”与目标计算机类型“ARM64”冲突
2. E0035: Building MFC application with /MD requires MFC shared dll version. Please define _AFXDLL
我们将分别解决这两个问题,但请注意,它们可能出现在同一个项目中,因此需要同时处理。
## 问题1: LNK1112 模块计算机类型冲突
这个错误表明链接器发现某些模块(通常是.obj文件或.lib文件)是为x86平台(32位)编译的,而当前项目配置的目标平台是ARM64(64位ARM架构)。这种架构不兼容导致链接失败。
### 解决步骤:
### 步骤1: 检查并设置正确的解决方案平台
1. 在Visual Studio的顶部工具栏中,找到“解决方案平台”下拉列表(通常在“解决方案配置”旁边)。
2. 确保当前选中的平台是“ARM64”。如果没有,请选择“ARM64”。如果下拉列表中没有“ARM64”选项,则需要添加:
- 打开“配置管理器”(可以通过右键点击解决方案 -> 配置管理器,或者在下拉列表中选择“配置管理器”)。
- 在“活动解决方案平台”下拉列表中选择“<新建...>”。
- 在“新建解决方案平台”对话框中,选择“ARM64”,并从“从此处复制设置”中选择“x64”(如果没有x64,选Win32也可以,但最好选x64,因为都是64位),然后勾选“创建新的项目平台”。
- 点击“确定”后,解决方案平台将切换为ARM64。
### 步骤2: 检查每个项目的平台设置
即使解决方案平台设置为ARM64,每个项目可能还有自己的设置。请确保每个项目都配置为ARM64:
- 在配置管理器中,检查每个项目的“平台”列,确保都是“ARM64”。如果不是,点击项目对应的平台列,从下拉菜单中选择“ARM64”或“新建”一个ARM64平台。
### 步骤3: 清理并重新生成
由于之前可能编译生成了x86的中间文件,需要清理:
- 在菜单栏中选择“生成” -> “清理解决方案”。
- 然后重新生成:“生成” -> “重新生成解决方案”。
### 步骤4: 检查引用的库文件
如果项目引用了第三方库(.lib文件),这些库文件必须是为ARM64编译的。如果它们是为x86编译的,就会导致LNK1112错误。
- 检查项目属性中引用的库文件路径:
- 打开项目属性(右键项目 -> 属性)。
- 进入“链接器” -> “常规” -> “附加库目录”,确保目录指向ARM64版本的库。
- 进入“链接器” -> “输入” -> “附加依赖项”,确保库文件名正确(例如,有些库可能有不同的命名约定,如后缀“_arm64”)。
- 如果第三方库没有提供ARM64版本,你需要自己编译该库的ARM64版本。
### 步骤5: 验证编译器设置
在项目属性中,确保编译器生成的目标是ARM64:
- 打开项目属性 -> “配置属性” -> “常规”。
- 检查“平台工具集”是否支持ARM64(如Visual Studio 2017版本15.9或更高版本)。
- 检查“目标平台版本”是否足够高(Windows 10或11的SDK,且支持ARM64)。
### 步骤6: 使用dumpbin检查库文件架构
如果仍然不确定某个库文件的架构,可以使用Visual Studio自带的dumpbin工具检查:
- 打开适用于VS的开发者命令提示符(如“x64 ARM 兼容工具命令提示符”或“Developer Command Prompt for VS”)。
- 运行命令:
```
dumpbin /HEADERS 你的库文件.lib
```
- 在输出中查找“machine”字段,如果是ARM64,会显示“machine (ARM64)”;如果是x86,会显示“machine (x86)”。
## 问题2: E0035 错误(需要定义_AFXDLL)
这个错误发生在MFC(Microsoft Foundation Classes)项目中。错误提示表明你使用了/MD(或多线程DLL)编译选项,但未定义_AFXDLL宏。这意味着项目使用了MFC的共享DLL版本,但未正确配置。
### 解决步骤:
### 步骤1: 在预处理器定义中添加_AFXDLL
1. 打开项目属性(右键项目 -> 属性)。
2. 进入“配置属性” -> “C/C++” -> “预处理器”。
3. 在“预处理器定义”中添加`_AFXDLL`(注意,如果已有其他定义,用分号分隔)。
4. 点击“应用”。
### 步骤2: 检查项目是否设置为使用MFC共享DLL
1. 在项目属性中,进入“配置属性” -> “常规”。
2. 检查“项目默认值”下的“使用MFC”选项,确保设置为“在共享 DLL 中使用 MFC”。
3. 点击“应用”。
### 步骤3: 检查运行库设置
1. 进入项目属性 -> “配置属性” -> “C/C++” -> “代码生成”。
2. 检查“运行库”选项,应该设置为“多线程 DLL (/MD)”或“多线程调试 DLL (/MDd)”。注意,如果使用MFC共享DLL,则必须使用/MD或/MDd。
3. 如果这里设置的是/MT(静态链接),那么需要改为/MD或/MDd(与MFC共享DLL一致),或者将MFC的使用方式改为静态库(但这样就不需要_AFXDLL了,但会增加可执行文件大小)。
### 步骤4: 重新生成项目
清理并重新生成项目。
## 综合注意事项
- 两个错误可能同时出现,因为项目配置可能存在多处问题。请按照上述步骤逐一检查。
- 如果项目之前是x86平台,现在迁移到ARM64,除了平台设置,还需要确保所有依赖库都有ARM64版本。
- 对于MFC项目,如果使用了一些第三方控件,同样需要ARM64版本。
## 引用说明
[^1]: Microsoft官方文档:解决链接器错误LNK1112
[^2]: Microsoft官方文档:使用MFC共享DLL的要求
§§相关问题§§
1. 如何在Visual Studio中配置多平台解决方案(x86, x64, ARM64)?
2. 如何为ARM64平台编译第三方库?
3. MFC应用程序中静态链接与动态链接MFC的区别和注意事项?
4. 如何检查Windows可执行文件或DLL的目标平台架构?</think>以下是针对 Visual Studio 编译错误 LNK1112 和 E0035 的完整解决方案,按问题类型分步说明:
---
### **问题 1: LNK1112(模块计算机类型 x86 与 ARM64 冲突)**
#### 根本原因
项目依赖的库文件(.lib)或对象文件(.obj)是为 x86 架构编译的,但当前项目目标平台是 ARM64,导致架构不兼容。
#### 解决方案
1. **验证解决方案平台**
- 在 VS 工具栏检查活动平台:
```diff
- 错误状态:显示 "Win32" 或 "x86"
+ 正确状态:应选择 "ARM64"
```
- 添加 ARM64 平台:
1. 右键解决方案 → **配置管理器**
2. 在 "活动解决方案平台" 下拉框选择 **<新建...>**
3. 创建新平台:`ARM64`,从 "x64" 复制设置[^1]
2. **检查项目级设置**
- 对每个项目执行:
1. 右键项目 → **属性**
2. **常规** → 设置:
```ini
平台工具集 = Visual Studio 2022 (v143) 或更高
目标平台版本 = 10.0.20348.0 或更高 # ARM64 最低要求
```
3. **链接器 → 高级** → 设置:
```ini
目标计算机 = /MACHINE:ARM64
```
3. **清理冲突的中间文件**
- 删除所有生成目录:
```powershell
rm -Recurse -Force Debug, Release, ARM64, ipch, .vs
```
- 在 VS 中执行:**生成 → 清理解决方案**
4. **验证第三方库架构**
- 使用 `dumpbin` 检查库文件:
```cmd
dumpbin /HEADERS YourLibrary.lib | findstr "machine"
```
- 期望输出:`machine (ARM64)`
- 若显示 `machine (x86)` 或 `machine (x64)`:
- 重新编译该库为 ARM64
- 使用 ARM64 编译环境:
```bat
call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" arm64
msbuild YourLib.vcxproj /p:Platform=ARM64
```
---
### **问题 2: E0035(MFC 共享 DLL 配置错误)**
#### 根本原因
项目使用 `/MD` 运行时库(动态链接),但未启用 MFC 共享 DLL 模式,导致 `_AFXDLL` 宏未定义。
#### 解决方案
1. **启用 MFC 共享 DLL**
- 项目属性 → **常规** → 设置:
```ini
使用 MFC = 在共享 DLL 中使用 MFC
```
2. **手动定义 _AFXDLL 宏**
- 项目属性 → **C/C++** → **预处理器** → **预处理器定义**:
```diff
+ 添加:_AFXDLL
```
3. **统一运行时库配置**
- 项目属性 → **C/C++** → **代码生成** → **运行时库**:
```ini
配置 | 设置
-----------------|------------------
Debug 模式 | /MDd
Release 模式 | /MD
```
- 确保**所有依赖项**使用相同配置
4. **检查 MFC 头文件包含**
- 在 `stdafx.h` 或主头文件中添加:
```cpp
#ifdef _AFXDLL
#include <afxwin.h> // MFC 核心组件
#include <afxext.h> // MFC 扩展
#endif
```
---
### **错误排查流程图**
```mermaid
graph TD
A[编译错误] --> B{LNK1112?}
A --> C{E0035?}
B -->|是| D[检查平台是否为ARM64]
D --> E[验证第三方库架构]
E --> F[重新编译库为ARM64]
C -->|是| G[检查MFC配置]
G --> H[定义_AFXDLL宏]
H --> I[统一/MD运行时库]
F & I --> J[清理并重建]
J --> K[错误解决]
```
> ⚠️ **关键注意事项**
> - ARM64 开发需要 Windows SDK 10.0.20348.0+ 和 VS 2019 v16.11+[^2]
> - MFC 共享 DLL 模式要求所有模块使用相同的运行时库(/MD 或 /MDd)
> - 混合 x86/ARM64 模块会导致 LNK1112;混合 /MT 和 /MD 会导致 E0035[^3]
---
### **相关问题**
1. 如何验证可执行文件(EXE/DLL)的目标架构类型?
2. 在 Visual Studio 中如何配置多平台解决方案(x86/x64/ARM64)?
3. 为 ARM64 平台编译 MFC 应用程序时有哪些特殊注意事项?
4. 如何解决跨架构调用时的 ABI 兼容性问题?
[^1]: VS 平台配置文档
[^2]: Microsoft ARM64 开发要求
[^3]: MFC 共享 DLL 配置指南
阅读全文
相关推荐




















