C++编译与链接(1)-编译与链接进度

由汇编程序生成的目的文件并不能立时就被实践,其中可能还有众多并未缓解的题材。例如,某个源文件中的函数可能引用了另一个源文件中定义的某部符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这几个问题,都亟需经链接程序的处理方能得以化解。

 

 

代码优化 — 修辞、文本编辑;

 

 

除外具有和谐的多少和二进制代码之外,还要至少提供2个表:未缓解符号表和导出符号表,分别报告链接器自己索要什么样和可以提供哪些。

 

 

代码生成 — 生成译文。

 

 

图片 1

运用cl /P main.cpp只进行预编译生成main.i文件

词法分析 — 识别单词,确认词类;比如int
i;知道int是一个品类,i是一个根本字以及判断i的名字是不是合法

 

This is a macro

g++ –E main.cpp>main.i命令

 

#ifndef   _HEADERNAME_H
#define  _HEADERNAME_H  1

#include <iostream>
inline void show(char *a)
{
    std::cout << a<< std::endl;//annotation
}

#endif

图片 2

C++的预处理是指在C++程序源代码被编译往日,由预处理器对C++程序源代码进行的处理。那一个历程并不对程序的源代码进行剖析。

g++中得以行使g++ -c命令

图片 3

g++ –c main.s –o main.o

 

编译器把一个cpp编译为目的文件的时候,除了要在对象文件里写入cpp里富含的数码和代码,还要至少提供3个表:未缓解符号表,导出符号表和地址重定向表。
未缓解符号表提供了独具在该编译单元里引用可是定义并不在本编译单元里的符号及其出现的地址。
导出符号表提供了本编译单元具有定义,并且愿意提须要此外编译单元使用的记号及其地址。
地点重定向表提供了本编译单元所有对自身地址的引用的记录。

 

 

C/C++程序从编译到最终生成可执行文件的经过分析
http://blog.csdn.net/wyb19890515/article/details/7211006   

1.预处理

 

g++ –S main.i main.s

g++ –S a.i a.s

 

 

汇编进度实际上指把汇编语言代码翻译成目的机器指令的进程。

 

temp.h

图片 4

世家领略计算机应用的一连串的1和0

开拓生成的A.i文件

 

100

语法分析 — 识别短语和句型的语法属性;

g++ a.o main.o –o main.out

图片 5

 

 

3、temp.h和main.cpp中的#include<iostream> 和#include
“temp.h”也在对应岗位被开展了

4.链接

 

 

图片 6

 

 

g++ –c a.s –o a.o

 

*在vs2013中得以运用“VS2013 开发人士命令提醒”

能够认为有以下的多少个环节

2.剔除注释

windows vs下

在最后的靶子文件中

 

3.甩卖预处理指令,如#include,#ifdef

main.cpp

 

g++  -S将预处理阶段生成的.i文件生成对应的汇编文件

源程序->预处理->编译和优化->生成指标文件->链接->可执行文件

3.生成靶子文件

参考文献

 

 

 

语义分析 — 确认单词、短语和句型的语义特征;

c/c++程序编译连接进度
http://blog.csdn.net/hitprince/article/details/7880241

 

 

#include "temp.h"
#define MACRO "This is a macro"

extern int i;
int main()
{
        std::cout<<i<<std::endl;
        show(MACRO);
}

在g++中能够利用

g++ –E a.cpp>main.i

2、main函数中的MACRO宏被替成了”this is a macro”

 

 

此间的预处理器(preprocessor)是指真的的编译初始往日由编译器调用的一个独立程序。

内联函数的交替就发出在这一品级

 

#include <iostream>
int i=100;

 

*g++中得以行使(在偏下只使用g++进行出现说法)

 

 

转移的一些代码如下:

 

 

最后运行结果如下

至极一个C++语言程序又是怎么从一个个.h和.cpp文件变成包涵1和0的可执行文件呢?

 

2.编译和优化

预处理爱慕要负责以下的几处

 

 

如大家有以下代码

1、show函数中的注释已经被删掉了

 

 

1.宏的交替

a.cpp

 

咱俩发现