首页 > 其他 > 详细

C程序生成原理

时间:2020-04-07 10:43:28      阅读:68      评论:0      收藏:0      [点我收藏+]

前处理

这就是所有这些#defines#includes的含义

C预处理是一个非常简单的过程:剪切粘贴。

当预处理器看到以下MyCode.c时:

#include "MyHeader.h"

void main(){
    FunctionDefinedInHeader();
}

,只需打开文件MyHeader.h,然后将其内容粘贴到MyCode.c中:


// Begin of MyCode.c
// Begin of MyHeader.h
#ifndef MYHEADER_H
#define MYHEADER_H

void FunctionDefinedInHeader(); // Declare the function

# endif
// End of MyHeader.h

void main(){
    FunctionDefinedInHeader(); // Use it
}

// End of MyCode

同样地,#定义 s的cut‘n粘贴的#if s的分析和潜在的除去等

在此步骤的最后,我们有一个预处理的C ++文件,没有任何#define,#if,#ifdef,#include,可以进行编译了。

汇编

编译器将C ++代码转换为CPU可以直接理解的表示形式。例如,以下代码:

int i=3;
int j=4*i+2;

将被翻译为:x86操作码。


mov         dword ptr [i],3
mov         eax,dword ptr [i]
lea         ecx,[eax*4+2]
mov         dword ptr [j],ecx

每个.cpp文件是分别编译的,结果二进制代码写在.o / .obj文件中。

技术分享图片

请注意,我们还没有可执行文件:还需要执行一个步骤。

连结中

链接器获取所有二进制代码(您的代码,以及来自外部库的代码),并生成最终的可执行文件。一些注意事项:

  • 库具有.lib扩展名。
  • 有些库是静态的这意味着.lib包含所有需要的x86操作码。
  • 一些库是动态的(也称共享)。这意味着.lib不包含任何x86代码。它只是说“我发誓功能FooBarWhatsNot将在运行时可用”。

链接器运行后,您将拥有一个可执行文件(Windows上为.exe,Unix上为.nothing_at_all):

技术分享图片

运行

启动可执行文件时,操作系统将打开.exe,然后将x86操作码放入内存。如前所述,某些代码目前尚不可用:动态库中的代码。但是链接器很好,可以说在哪里寻找它:.exe清楚地表明glClearColor函数是在OpenGL32.dll中实现的。

技术分享图片

Windows将愉快地打开.dll并找到glClearColor:

技术分享图片

有时找不到.dll,可能是因为您搞砸了安装过程,并且程序无法运行。

技术分享图片

C程序生成原理

原文:https://www.cnblogs.com/wwhhgg/p/12620257.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!