windows go语言 调用dll_编译器


1. 主要步骤

( test.c main.c ) --1--> (test.i main.i) --2--> (test.s main.s) --3--> (test.o main.o) --4--> (a.out)

1 预处理,展开头文件/宏替换/全掉注释/条件编译

2 编译,检查语法,生成汇编

3 汇编,汇编代码转换成机器码

4 链接,链接到一起生成可执行文件

2.编译流程


windows go语言 调用dll_编译器_02


3.预处理

C语言中"#"作用是作为预处理命令,在编译器进行编译之前对源码做某些转换.

# 本身为预处理指令,必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。格式一般为#include <头文件名.h>。

库文件使用#include<***.h>

自定义头文件使用#include"***.h"


windows go语言 调用dll_可执行文件_03


(1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换

(2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些

(3)处理#include,将#include指向的文件插入到该行处

(4)删除所有注释

(5)添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行

(6)保留#pragma编译器指令,因为编译器需要使用它们。

#include本质上只是内容替换,那在一个源码中调用另一个源码的函数时能否直接写‘’#include“test.c”’,将test.c的内容复制到当前源码中编译呢?直接编译会发现报错,原因是在一个项目里出现两个一样的函数(当前源码和test.c)。

4.编译

检查C语言的语法,然后生成汇编代码

5.汇编

将汇编代码转换成机器码

6.链接

我们写的代码中有部分的函数的具体执行步骤,即函数对应的机器码在我们的源码里是没有的。单纯只是将我们的源码编译成机器码无法完整的执行所有功能,需要于库文件或者其他源码进行连接才能生成一个完整的可执行文件。

静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由编译器或汇编器生成)链接到一块生成可执行程序。静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。