RuntimeLibrary 的不匹配项以及在VS中常见的编译错误问题以及解决方案

本文档详细介绍了在Visual Studio中遇到的各种常见编译错误及其解决方案,包括运行库不匹配、MFC程序编译错误、函数安全性警告等问题,并提供了具体的步骤来帮助开发者快速定位并解决问题。

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

在工程中有时候需要引入外部的lib最常出现的一个错误就是 运行库不匹配 这个问题解决方法如下

在工程上右键-》属性-》c/c++-》代码生成-》运行库 进行设置
有四个选项及含义分别如下:
多线程调试Dll (/MDd) 对应的是:静态库的Debug版本
多线程Dll (/MD) 对应的是:静态库的Release版本
多线程(/MT) 对应的是:动态库的Release版本
多线程(/MTd)对应的是:动态库的Debug版本

 

然后将引入的库和工程应用的运行库保持一致就行

例如:工程使用的是静态库的Debug版本 那么对应的lib库也要使用静态的Debug版本 这样保持一致一般就不会出现问题了

 

在编译MFC程序的时候出现下列及类似的错误:
1>uafxcwd.lib(afxmem.obj) : error LNK2005
1>uafxcwd.lib(afxmem.obj) : error LNK2005

 

这个问题就是 两个属性的设置问题

解决方法如下: 
项目属性页-》链接器-》输入 
顺序一定是下面这个顺序
附加依赖库:uafxcwd.lib;LIBCMTD.lib;

忽略特定默认库:LIBCMTD.lib;uafxcwd.lib

错误原因:这两个库都有自己的New和Delete方法,会冲突 所以需要指定顺序

 

补充问题:

问题一:新的IDE对以前的函数可能存在一个报错问题

例如:fopen在VS2017中就会出现一个关于This function or variable may be unsafe ……这样的问题,提示出现关键字【_CRT_SECURE_NO_WARNINGS

解决方法:点击项目--》属性--》c/c++--》预处理器--》预处理定义--》将关键字【_CRT_SECURE_NO_WARNINGS】添加进去就行了

 

问题二:关于VS2017的注释问题

解决方法:

注释:     先CTRL+K,然后CTRL+C
取消注释: 先CTRL+K,然后CTRL+U
输出标准格式: 先CTRL+K,然后CTRL+F

左缩进: shift + Tab

 

问题三:每次调试的时候都会加载符号的问题

打开VS的【工具】-【选项】-【调试】-【符号】,如下图:
1、先取消勾选“Microsoft符号服务器”
2、点击“清空符号缓存”
3、重启VS20xx
参考文档:

https://blog.youkuaiyun.com/hellokandy/article/details/51393306

 

问题四:在VS中打开工程小红线问题

检查库和头文件都包含进去的情况下没有用就重启VS

 

问题五:在VS中编译Win32程序出现问题:“令牌匹配错误……”

修改配置属性
常规 平台工具集 修改到 VS2015就可以解决这类问题了
在控制台程序中使用MFC资源 需要添加头文件 Afx.h 并且工程设置为 MT 静态库的多线程模式

这样就可以在控制台程序中使用MFC中的类了

 

### 解决方案 #### 问题分析 `LNK2038` 是链接器错误,通常发生在目中的同模块使用的运行时库版本一致的情况下。具体来说: - `_ITERATOR_DEBUG_LEVEL` 的值表示迭代器调试级别,在 Debug 和 Release 模式下的默认值分别为 `2` 和 `0`[^2]。 - `RuntimeLibrary` 表示程序使用的 C++ 运行时库类型。常见的选有: - `MD`: 动态链接 Release 版本的 CRT 库。 - `MT`: 静态链接 Release 版本的 CRT 库。 - `MDd`: 动态链接 Debug 版本的 CRT 库。 - `MTd`: 静态链接 Debug 版本的 CRT 库。 当目的某些部分使用了同的运行时库配置(例如一部分代码使用 `MD` 而另一部分使用 `MDd`),就会触发此错误[^1]。 --- #### 解决方法 ##### 方法一:统一 `_ITERATOR_DEBUG_LEVEL` 如果问题是由于 `_ITERATOR_DEBUG_LEVEL` 匹配引起的,则可以通过修改目的设置来解决。以下是操作步骤的具体描述: 1. **启用迭代器调试支持** 如果目标是 Debug 模式,可以在目的 GN 文件中添加以下参数以强制启用迭代器调试支持: ```gn enable_iterator_debugging = true ``` 此参数会将 `_ITERATOR_DEBUG_LEVEL` 设置为 `2`,从而与 Debug 模式的标准保持一致。 2. **禁用迭代器调试支持** 如果目标是 Release 模式,可以确保所有的依赖都未启用迭代器调试功能。这通常是通过确保所有库均在 Release 模式下构建实现的。 --- ##### 方法二:统一 `RuntimeLibrary` 为了消除因运行时库匹配引发的错误,需确保整个目及其依赖使用相同的运行时库配置。 1. **检查当前目的运行时库设置** 打开 Visual Studio 的目属性窗口,导航至: ``` Configuration Properties -> C/C++ -> Code Generation -> Runtime Library ``` 确认其值是否与其他依赖一致。如果是 Debug 模式,应选择 `Multi-threaded Debug DLL (/MDd)`;如果是 Release 模式,则选择 `Multi-threaded DLL (/MD)`。 2. **调整第三方库的运行时库设置** 对于外部依赖(如 libcef 或其他静态/动态库),需要确认它们是在何种模式下编译的。例如,libcef 提供的库文件可能仅适用于特定的运行时库配置。因此,建议下载与其相匹配的版本[^3]。 3. **重新编译第三方库** 如果无法找到完全匹配的预编译库,可以选择自行重新编译这些库,并指定所需的运行时库类型。例如,对于 MQTT 客户端库,可参考文档[^4]进行自定义编译。 --- ##### 方法三:分离 Debug 和 Release 构建环境 为了避免混合使用 Debug 和 Release 模式的库,推荐分别创建独立的构建目录用于 Debug 和 Release 模式。这样可以有效防止意外引入兼容的库文件。 --- ### 示例代码 以下是一个简单的脚本,用于批量更新 Visual Studio 工程文件中的运行时库设置(假设使用 MSBuild): ```powershell function UpdateRuntimeLibrary { param ( [string]$projectFile, [string]$runtimeLibrary ) $xml = [xml](Get-Content $projectFile) foreach ($config in $xml.Project.PropertyGroup) { if ($config.RuntimeLibrary) { $config.RuntimeLibrary = $runtimeLibrary } } $xml.Save($projectFile) } # 使用示例 UpdateRuntimeLibrary -projectFile "MyProject.vcxproj" -runtimeLibrary "/MD" ``` 上述脚本可以根据需求自动替换工程文件中的运行时库设置。 --- ### 总结 通过以上三种方法之一即可解决 `LNK2038` 错误。核心在于确保整个目及其依赖的一致性,无论是 `_ITERATOR_DEBUG_LEVEL` 还是 `RuntimeLibrary`,都需要严格对齐。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值