C++ 常见错误锦集

文章列举了在VisualStudio中常见的编译、链接错误和调试问题,包括LNK1158、LNK2019、0xC0000005异常、调试信息设置等,并提供了详细的解决方法,如选择正确的平台工具集、修改调试信息格式、处理内存分配等。
摘要由CSDN通过智能技术生成

1、LNK1158错误:无法运行“rc.exe”

解决方法:项目属性-常规-平台工具集里,选择带有XP的平台工具集(Visual Studio 2013 - Windows XP (v120_xp));

2、fatal error: winapifamily.h: No such file or directory     (错误,找不到winapifamily.h文件)

解决方法:winapifamily.h是在win8中才有的头文件,如果文件中未用到该头文件,可把相关代码注释,重新编译即可;

3、VS2010中设置的断点无效:“当前不会命中断点,还没有为该文档加载任何符号”。

原因:折腾了一阵,其实问题主要出在没有生成调试信息。比较弱的错误是在Release下运行,肯定进不了断点,改成Debug就行;当然非得在Release下设置断点的话,可以通过下面的解决方法来搞。

解决方法:

(1)项目-〉属性-〉配置属性-〉C/C++-〉常规-〉调试信息格式,这里不能为“禁用”。

(2)项目-〉属性-〉配置属性-〉链接器-〉调试-〉生成调试信息,这里设为“是”。

4、0x????处未处理的异常:0xC0000005 ,使用VC编码的时候经常会出现“Test.exe 中的 0x00414030 处未处理的异常: 0xC0000005: 写入位置 0xfeeefeee 时发生访问冲突 。” 

出现0xC0000005的原因一般都是没有分配内存 或者 内存无效 所致,

 例如:   

    #include "stdafx.h"
    #include <string>
    using namespace std;
    int _tmain(int argc, _TCHAR* argv[])
    {

    string * s = NULL;
    s = new string();
    delete s;
    if (s != NULL)
    {
       *s = "TEST"; //这步操作将引起异常。
    }
    return 0;
    }

        虽然s已经被delete了,但是s的值并不为NULL,if语句的判断将失效,这是新手常见的一个错误!

解决方法:为了防止这个错误可以自己定义一个宏来处理delete。

        #define _DELETE(obj) if (obj != NULL) {delete obj , obj = NULL;} 使用这个宏可以防止类似错误出现。

5、error LNK2019: 无法解析的外部符号....该符号在函数 ...中被引用

原因:只声明了构造函数,MyClass(); ,但未定义。 可以定义空函数,或者直接注释掉,使用默认构造函数。

解决方法:这种情况一般都是函数只找到声明但没有实现,或者是少了什么链接库,你可以试试把那两个.h和.c文件直接加入工程中再试试。    

6、由于编译和链接的设置而造成的LNK2001,(error LNK2019: 无法解析的外部符号 "public: __thiscall MyClass(void))

解决方法:

        (1)XXX.lib头文件,这个要包含(不然编译也不能通过)

        (2)需要XXX.lib或XXX.dll库。手动添加,项目->属性->配置属性->链接器->输入 然后在附件依赖项添加XXX.lib,再生成第一个无法解析的外部符号错误消失了。
     
        由于编码错误导致的LNK2001

        静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访问任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。函数内声明的变量(局部变量) 只能在该函数的范围内使用。

        C++ 的全局常量只有静态连接性能。这不同于C,如果试图在C++的 多个文件内使用全局变量也会产生LNK2001错误。一种解决的方法是需要时在头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种 方法是使用时给该变量赋以常数。

7、error LNK2005: ___crtExitProcess 已经在 LIBCMTD.lib(crt0dat.obj) 中定义

        有时候, 在 Debug 模式下编译模式下, 换到 Release 模式就发生一堆问题. 典型的例子, 就是因为 c++ runtime library 设定不同, 所造成的重复定义连接错误.  而另一个常见的例子是专案与 library 使用不同的字元集合設定 (如: 一個用 Unicode Character Set, 另一個用 Multi-Byte Character Set) 这个错误发生的原因, 有可能是

   1. 你 link 的 lib 使用 C++ Multi-threaded DLL (/MD)

    2. 而你的 source 使用的 C++ runtime library 是 Multi-threaded (/MT)

解决方法:

        两个使用相同的 C++ runtime library.例如都使用 static 的 Multi-threaded (/MT).

8、error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 LIBCMT.lib(typinfo.obj) 中定义 MSVCRTD.lib

解决方法:

        项目 -> 属性 -> c/C++ -> 代码生成 -> 运行时库 设置为: 多线程调试 DLL (/MDd)

        被引用的库和调用的程序编译选项不同,需要改成一致后编译

9、CVTRES : fatal error CVT1100: 重复的资源。type:MANIFEST, name:1, language:0x0409
     另一个则提示为:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏已经到了链接期,应该说,问题就不像编译通不过那么别扭了,而查阅MSDN关于这两个问题的说明,终于找到了解决的方法,现简单的陈述如下:

        首先,出现这两个问题的原因都是一个,即文件中的现有资源文件和新资源字符串表 ID 冲突。微软也给出了解决这个问题的方法,但是,在现有的情况下,这个方法是靠不住的,因为,不可能不使用wx.rc资源。所以,一个变通的解决方法就是:

解决方法:

        工程属性->配置属性-> 清单工具->输入和输出->嵌入清单,选择[否],即可。

10、error C2143: 语法错误 : 缺少“;”(在“*”的前面)

        原因:产生错误处,某类型未include,可能头文件名拼写错误、头文件名已更改

11、error LNK1123 :(LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 )
     VS2010,或者卸载VS2012安装2010后,建立Win32 Console Project/MFC项目时会出现"LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏"的错误。

解决方法:查看计算机是否为64bit操作系统,如是,继续如下操作。
             查找是否有两个cvtres.exe。
             C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe
             C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe
             右键属性—详细信息, 查看两者版本号,删除/重命名较旧的版本,或者重新设置Path变量。

12、VS2010 出现警告,VS2013编译出现错误,原因:版本兼容性问题,itoa是最早的形式,以被废弃,所以在msdn中查不到了,但MS为了保持兼容性(比如VC很早的版本只认识itoa)所以两种形式都存在了
     vs2013 error C4996: 'strcmpi': The POSIX name for this item is deprecated.
     warning C4996: 'itoa': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _itoa. See online help for details
     error C4996: 'getpid': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getpid. See online         help for details.

解决方法1:选中项目,点击右键,选择“属性”菜单项,C/C++ --->预定义处理器定义,在其中添加 _CRT_SECURE_NO_WARNINGS 即可解决;

解决方法2::“_itoa”被声明为否决的 一样的问题, 将_itoa_s() 替换_itoa()即可.我这样替换了就没有警告了,或者错误。


**************************************************************************************************************

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值