c++编译过程理解

本文详细介绍了C++程序的编译过程,包括预编译、编译和链接三个阶段。在预编译阶段,头文件被展开,宏调用被处理。编译阶段,每个cpp文件生成一个obj文件。链接阶段,所有obj文件与库文件结合生成最终的可执行文件。此外,讨论了模板的编译、防止头文件重复包含的宏、extern "C"的作用以及编译错误和链接错误的区别。
摘要由CSDN通过智能技术生成

1.Makefile就知道了。先直接用命令行操作,然后用集成的IDE来写代码。

2.对于编译过程,总体上是这样

<1>源代码(*.h,*.cpp/c)经过预编译,编译,生成目标文件(Windows下应该是.obj文件,Linux/unix下是.o文件)

<2>然后通过链接(将各种目标文件.obj(.o) 和 目标文件的集合(动态静态库dll(windows下),so(linux/unix下)))

<3>最终成功可执行文件(Windows下叫exe,Linux/unix下随便以什么结尾了)。

*.obj,*.pch,*.dsp,*.ncb,*.plg 这些,除了obj,其他都是微软集成的编译器做的事情了,微软其实也有个类似makefile的东西,其实你可以不用去关注的。这些C++本身无关。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

c++程序在编译后,在目标路径下会生成多个文件:
Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg
*.exe:是生成的可执行文件
*.ilk:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息
*.obj:是目标文件,源程序编译后的产物
*.pch:全称是PreCompiled Header,就是预先编译好的头文件
*.idb:文件保存的信息,使编译器在重新编译的时候只重编译最新改动过的函数和只对最新类定义改动过的源文件进行重编译,以提高编译速度
*.pdb:全称是Program DataBase,即程序数据库文件,用来记录调试信息
*.dsp:(全称是Developer Studio Project)也是一个配置文件
*.ncb:(全称No Compile Browser)的缩写,其中存放了供ClassView、WizardBar和Component Gallery使用的信息,由VC开发环境自动生成
*.plg:实际上是一个超文本文件,可以用Internet Explorer打开,记录了Build的过程
*.cpp:就是C++源代码文件.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Part1


这里讲下C++文件的编译过程及其中模板的编译过程;

一:一般的C++应用程序的编译过程。
    一般说来,C++应用程序的编译过程分为三个阶段。模板也是一样的。

  1. 在cpp文件中展开include文件。
  2. 将每个cpp文件编译为一个对应的obj文件。
  3. 连接obj文件成为一个exe文件(或者其它的库文件)。

下面分别描述这几个阶段。
1.include文件的展开。
    include文件的展开是一个很简单的过程,只是将include文件包含的代码拷贝到包含该文件的cpp文件(或者其它头文件)中。被展开的cpp文件就成了一个独立的编译单元。在一些文章中我看到将.h文件和.cpp文件一起看作一个编译单元,我觉得这样的理解有问题。至于原因,看看下面的几个注意点就可以了。
    1):没有被任何的其它cpp文件或者头文件包含的.h文件将不会被编译。也不会最终成为应用程序的一部分。先看一个简单的例子:

1  ========== test.h文件 ==========
2  //  注意,后面没有分号。也就是说,如果编译的话这里将产生错误。
3  void  foo()
在你的应用程序中添加一个test.h文件,如上面所示。但是,不要在任何的其它文件中include该文件。编译C++工程后你会发现,并没有报告上面的代码错误。这说明.h文件本身不是一个编译单元。只有通过include语句最终包括到了一个.cpp文件中后才会成为一个编译单元。

    2):存在一种可能性,即一个cpp文件直接的或者间接的包括了多次同一个.h文件。下面就是这样的一种情况:
复制代码
 1  //  ===========test.h============
 2  //  定义一个变量
 3  int  i;
 4 
 5  //  ===========test1.h===========
 6  //  包含了test.h文件
 7  #include  " test.h "
 8 
 9  //  ===========main.cpp=========
10  //  这里同时包含了test.h和test1.h,
11  //  也就是说同时定义了两个变量i。
12  //  将发生编译错误。
13  #include  " stdafx.h "
14  #include  " test.h "
15  #include  " test1.h "
16 
17  void  foo();
18  void  foo();
19 
20  int  _tmain( int  argc, _TCHAR *  argv[])
21  {
22       return   0 ;
23  }
复制代码
上面的代码展开后就相当于同时在main.cpp中定义了两个变量i。因此将发生编译错误。解决办法是使用#ifndef或者#pragma once宏,使得test.h只能在main.cpp中被包含一次。关于#ifndef和#pragma once请参考 这里

    3):还要注意一点的是,include文件是按照定义顺序被展开到cpp文件中的。关于这个,请看下面的示例。
复制代码
 1  //  ===========test.h============
 2  //  声明一个函数。注意后面没有分号。
 3  void  foo()
 4  c++程序在编译后,在目标路径下会生成多个文件:
Debug文件夹(*.exe,*.ilk,*.obj,*.pch,*.pdb,*.idb,*,pdb),*.cpp,*.dsp,*.ncb,*.plg
*.exe:是生成的可执行文件
*.ilk:当选定渐增型编译连接时,连接器自动生成ILK文件,记录连接信息
*.obj:是目标文件,源程序编译后的产物
*.pch:全称是PreCompiled Header,就是预先编译好的头文件
*.idb:文件保存的信息,使编译器在重新编译的时候只重编译最新改动过的函数和只对最新类定义改动过的源文件进行重编译,以提高编译速度
*.pdb:全称是Program DataBase,即程序数据库文件,用来记录调试信息
*.dsp:(全称是Developer Studio Project)也是一个配置文件
*.ncb:(全称No Compile Browser)的缩写,其中存放了供ClassView、WizardBar和Component Gallery
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值