基于C++中常见编译错误的总结详解

在日常编码过程中会遇见各种编译错误,本文对常见的编译错误进行分析总结。(基本的编译错误在这里不列举,后续后持续更新)

1、error c101008a解决方法
该错误出现在项目升级过程中会出现,比如说项目从vs2008升级到vs2010.
解决办法:在项目上点右键,清理(Clean),重新编译,问题解决

2、error C2252解决方法
该错误主要在项目从vs2008升级到vs2010出先。
error C2252: an explicit instantiation of a template can only occur at namespace scope
解决方法:将特例话的模板移到类外面(It is saying that you cannot explicitly instantiate a template inside a function or a class.Move it to outside the function or class.)

3、error C2143:语法错误:缺少“;”(在“*”的前面)
该错误主要是某类型数据未include,可能是都文件拼写错误、或者头文件名已经更改、或是头文件忘记“;”
解决办法:检查头文件是否更名、是否忘记结束的“;”

4、error C1010:查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h”
解决办法:在报错行所在的文件的最前面添加“#include "StdAfx.h”

5、error C1189:出现了WINDOWS.H already included. MFC apps must not #include <windows.h>的处理办法。
解决办法:把#include<afxwin.h>提到最前面去就可以编译成功了。

6、error LNK2005: _DllMain@12 already defined in dllmain.obj
解决办法:你只需要在工程设置里面把WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL
中的_USRDLL,删除,就可以正确编译了

7、R6010错误,出现R6010错误的原因很多
1、数据库缺少一个视图、
2、数据库某个存储过程名发生变化,也可能是参数个数发生变化。
3、exe和dll是否混用的不同版本的crt
4、内存资源未释放
5、输出参数不正确
总之:windows将自身无法定位到的错误类型都归结为R6010错误

8、error C2361:initialization of
error C2361: initialization of 'iter2' is skipped by 'default' label
解决办法:出现这个问题原因是因是switch没有正常的初始化,只需要在iter2的位置控制其作用域即可,在这里添加{}就可以了。
案例分析:来自实际项目的一段代码,简化形式如下:
 switch (t)
 {
 case 0:
  int a = 0;
  break;
 default:
  break;
 }
有什么问题吗?似乎没有。请用编译器编译一下……
嗯?!一个错误“error C2361: initialization of 'a' is skipped by 'default' label”。这怎么可能?
几番思琢,悟出解释:
C++约定,在块语句中,对象的作用域从对象的声明语句开始直到块语句的结束,也就是说default标号后的语句是可以使用对象a的。
如果程序执行时从switch处跳到default处,就会导致对象a没有被正确地初始化。
确保对象的初始化可是C++的重要设计哲学,所以编译器会很严格地检查这种违例情况,像上述的示例代码中default语句后面并没有使用a,
但考虑到以后代码的改动可能无意中使用,所以一样被封杀。
明白了原因,解决起来就很容易了。只要明确地限制对象a的作用域就行了。
 switch (t)
 {
 case 0:
  { //added for fix problem
  int a = 0;
  break;
  } //added for fix problem
 default:
  break;
 }
在switch...case...结构中不能在case中定义新变量,for(int i = 0;...)
除非将定义新变量的case用块{}包住,或者选择将你的新变量在switch之前。

9、Link2019:unresolved external symbol 'symbol' referenced in function 'function'
函数只有申明,没有实现时,或是DLL中的函数没有export

时间: 2013-05-13

C/C++程序编译流程详解

程序的基本流程如图: 1.预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同. 读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理 ①将所有的"#define"删除,并且展开所有的宏定义 ②处理所有的条件编译指令,如:"#if"."#ifdef"."#elif"."#els

解决VC++编译报错error C2248的方案

在使用诸如:CArray或是 CList等类时,经常会出现此错误 此错误的原因是由于自定义的类的数组项时 有一个操作如  Add()  在这个操作中,实际上需要一个 = 操作,但是这个 =操作在 自定义类中没有实现,于是,程序自动去它的parent 类 也就是 CObject 类去找,但是却找到个这个类的 = 是一个 private  于是就报了这个错误. 知道了原因解决方法自然就有了,那就是在自定义类中 重载操作符 =   重载后 这个错误就没有了. class COptRect : publ

C/C++编译器GCC下的常用编译命令总结

简介 GCC的意思是GUN C Compiler.经过了多年的发展,GCC已经不仅仅能支持C语言了,它现在还支持Ada语言.C++语言.Java语言.Objective C语言.Pascal语言.COBOL语言,以及支持函数式编程和逻辑编程的Mercury语言等等.而GCC也不再单只是GUN C语言编译器的意思了,而是变成了GUN Complier Collection也即是GUN编译器家族的意思了.另一方面,说到GCC对于操作系统平台以及硬件平台支持,概括起来就一句话:无所不在. 编译 示例程

Mac下使用Eclipse编译C/C++文件出现 launch failed, binary not found 解决方案

新建C/C++工程第一页,toolchains选择哪个都一样,如图: 第二步: 而后点击"Advanced settings",出现下图: 将第一项取消,第二项选上,点击 OK. 而后点击下一步,点击结束. 新工程完成后,随便新建一个语法正确的初始 .c 文件,然后 command+b "Build All",根目录下出现Binaries目录,大功告成!

解析C++编程中的#include和条件编译

文件包含的作用 所谓"文件包含"处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中.C++提供了#include命令用来实现"文件包含"的操作.如在file1.cpp中有以下#include命令: #include ″file2.cpp″ 它的作用见图示意. "文件包含"命令是很有用的,它可以节省程序设计人员的重复劳动. #include命令的应用很广泛,绝大多数C++程序中都包括#include命令.现在,

解析C语言与C++的编译模型

首先简要介绍一下C的编译模型: 限于当时的硬件条件,C编译器不能够在内存里一次性地装载所有程序代码,而需要将代码分为多个源文件,并且分别编译.并且由于内存限制,编译器本身也不能太大,因此需要分为多个可执行文件,进行分阶段的编译.在早期一共包括7个可执行文件:cc(调用其它可执行文件),cpp(预处理器),c0(生成中间文件),c1(生成汇编文件),c2(优化,可选),as(汇编器,生成目标文件),ld(链接器). 1. 隐式函数声明 为了在减少内存使用的情况下实现分离编译,C语言还支持"隐式函数

ubuntu 下编译C++代码出现的问题解决

同样的代码, 同样的makefile 文件 1)在mac 下顺利编译: 2)在新的ubuntu 下,编译失败: 报错信息: string.h 中各种 函数找不到: makefile: 复制代码 代码如下: //[这是后来添加的 CL_HEADER := -I/usr/include/ CL_LIBS := -L/usr/lib/ //后来添加的] clcp: main.o cl_string_utils.o cl_log.o g++ ${CL_HEADER} ${CL_LIBS}  -o clc

C++编译器无法捕捉到的8种错误实例分析

本文实例分析了C++编译器无法捕捉到的8种错误,分享给大家供大家参考之用.有助于深入理解C++运行原理,具体分析如下: 众所周知,C++是一种复杂的编程语言,其中充满了各种微妙的陷阱.在C++中几乎有数不清的方式能把事情搞砸.幸运的是,如今的编译器已经足够智能化了,能够检测出相当多的这类编程陷阱并通过编译错误或编译警告来通知程序员.最终,如果处理得当的话,任何编译器能检查到的错误都不会是什么大问题,因为它们在编译时会被捕捉到,并在程序真正运行前得到解决.最坏的情况下,一个编译器能够捕获到的错误只

在Linux下编译C或C++程序的教程

从开始学习C/C++我们都在是windows下,那么如何(怎样)在linux中编译C/C++代码?在linux终端下(命令行中)编译译C/C++代码? 在任何linux分支下编译C/C++代码,如 Ubuntu ,Red Hat, Fedora ,Debian 以及其他linux分支上,我们需要安装一下软件包: 1.GNU C and C++ compiler collection 2.Development tools 3.Development libraries 4.IDE or text

基于C++自动化编译工具的使用详解

@echo off  title=HYTradingGateway自动化编译打包工具mode con cols=80 lines=40echo -------------------------------------------------------------echo 使用说明echo.                                                             echo HYTradingGateway自动化编译打包工具.修改echo 使用前提

前端必会的轻量打包工具gulp使用详解

目录 一. 安装Node和gulp 二.使用gulp压缩Js 2.1 方法 2.2 步骤 三. 压缩CSS文件 3.1 步骤 四. 压缩图片 五. 编译Less文件 六. 编译Sass文件 一. 安装Node和gulp gulp 是基于 node 实现 Web 前端自动化开发的工具,利用它能够极大的提高开发效率. 在 Web 前端开发工作中有很多“重复工作”,比如压缩CSS/JS文件.而这些工作都是有规律的.找到这些规律,并编写 gulp 配置代码,让 gulp 自动执行这些“重复工作”. 安装

基于PowerShell在Ubuntu系统的使用详解

本文主要介绍如何在Ubuntu 16.04 LTS上安装和使用PowerShell.要知道,PowerShell Core是微软公司推出的一个跨平台(Windows,Linux和macOS)自动化和配置工具/框架,可与现有工具很好地配合使用,并对结构化数据(如JSON, CSV,XML等),REST API和对象模型的处理做了优化.PowerShell包括一个命令行shell,一个相关的脚本语言和一个处理cmdlet的框架. 下面先介绍在Ubuntu 16.04(Xenial Xerus)服务器

基于Debian的linux系统软件安装命令详解 (推荐)

Debian简介 广义的Debian是指一个致力于创建自由操作系统的合作组织及其作品,由于Debian项目众多内核分支中以Linux宏内核为主,而且 Debian开发者 所创建的操作系统中绝大部分基础工具来自于GNU工程 ,因此 "Debian" 常指Debian GNU/Linux. 非官方内核分支还有只支持x86的Debian GNU/Hurd(Hurd微内核),只支持amd64的Dyson(OpenSolaris混合内核)等.这些非官方分支都存在一些严重的问题,没有实用性,比如H

基于C++ bitset常用函数及运算符(详解)

C++ bitset--高端压位卡常题必备STL ------------------------------------------------------------ 以下内容翻译自cplusplus.com,极大地锻炼了我的英语能力. bitset存储二进制数位. bitset就像一个bool类型的数组一样,但是有空间优化--bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一. bitset中的每个元素都能单独被访问,例如对于一个叫做foo的bitset,

classloader类加载器_基于java类的加载方式详解

基础概念 Classloader 类加载器,用来加载 Java 类到 Java 虚拟机中.与普通程序不同的是.Java程序(class文件)并不是本地的可执行程序.当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader. JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现

Centos下编译安装Nginx教程详解

一.安装nginx时必须先安装相应的编译工具 yum -y install gcc gcc-c++ autoconf automake yum -y install zlib zlib-devel openssl openssl-devel pcre-devel 建立nginx 组 groupadd -r nginx useradd -s /sbin/nologin -g nginx -r nginx id nginx zlib:nginx提供gzip模块,需要zlib库支持 openssl:n

基于Python的文件类型和字符串详解

1. Python的文件类型 1. 源代码--直接由Python解析 vi 1.py #!/usr/bin/python print 'hello world' 这里的1.py就是源代码 执行方式和shell脚本类似: chmod +x 后,./1.py Python 1.py 2. 字节代码 Python源码文件经编译后生成的扩展名为pyc的文件 编译方法: [root@t1 py]# cat 2.py #!/usr/bin/python import py_compile py_compil

基于tomcat的连接数与线程池详解

前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xml 中写到过:Connector的主要功能,是接收连接请求,创建Request和Response对象用于和请求端交换数据:然后分配线程让Engine(也就是Servlet容器)来处理这个请求,并把产生的Request和Response对象传给Engine.当Engine处理完请求后,也会通过Conn

apache commons工具集代码详解

Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. Con