现在的位置: 首页 > 综合 > 正文

gcc编译的具体执行过程

2014年02月09日 ⁄ 综合 ⁄ 共 1292字 ⁄ 字号 评论关闭

预处理---->编译---->汇编----->链接

假设有hello.c文件,

预处理:gcc -E hello.c -o hello.i   (hello.i是预处理过后生成的文件)
编译器将C源代码中的包含的头文件如stdio.h编译进来,用户可以使用gcc的选项”-E”进行查看.

编译:gcc –S hello.i –o hello.s    (hello.s是存放的汇编代码)
在这个阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc把代码翻译成汇编语言。用户可以使用”-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

汇编:gcc –c hello.s –o hello.o
汇编阶段是把编译阶段生成的”.s”文件转成二进制目标代码.

链接:gcc hello.o –o hello.exe
将编译输出文件hello.o链接成最终可执行文件hello.exe

比如我准备这么写一个dll的,可以先这样写,可以先使用一下看看。

dlltest.h

 #ifndef _DLLTEST_H_
 #define _DLLTEST_H_

 #include <iostream.h>
 #include <stdio.h>
 #include <windows.h>

 extern "C" __declspec(dllexport) void NumberList();
 extern "C" __declspec(dllexport) void LetterList();

 #endif

dlltest.cpp

 #include "dlltest.h"

 extern "C" __declspec(dllexport)
 void NumberList() {
     cout << "This in in NumberList" << endl;
 }

 extern "C" __declspec(dllexport)
 void LetterList() {
       cout << "This is in LetterList!" << endl;
 }

usedll.cpp

 #include <conio.h>
 #include <dlltest.h>

 int main(){
	NumberList();
	LetterList();
	cout << "endl" << endl;
	return 0;
 }

编译的选项是:

g++ -o E:\WorkSpace\Dll_WorkSpace\dlltest.o   -c E:\WorkSpace\Dll_WorkSpace\dlltest.cpp
g++ -IE:\WorkSpace\Dll_WorkSpace  -o E:\WorkSpace\Dll_WorkSpace\usedll.o  -c E:\WorkSpace\Dll_WorkSpace\usedll.cpp

这里加个大写的i在这,是因为头文件在这里面

然后:将.o文件链接。

g++ E:\WorkSpace\Dll_WorkSpace\dlltest.o  E:\WorkSpace\Dll_WorkSpace\usedll.o  -o E:\WorkSpace\Dll_WorkSpace\dlltest.exe

就完成了编译。good job。



【上篇】
【下篇】

抱歉!评论已关闭.