• DIY一款C/C++编译器


    一. 原理

    1.1 记事本编程

    我们用记事本新建一个文件,文件后缀改成.c,例如文件名叫做"1.c",在文件里写上最简单的C或者C++代码,

    1 #include<stdio.h>
    2 #include<stdlib.h>
    3 int main()
    4 {
    5     printf("记事本编程");
    6     system("pause");
    7     return 0;
    8 }

    不使用VS或者CodeBlock打开它的情况下,怎样编译、运行呢?

    1.2 使用CodeBlock自带的MinGW编译。

    假设你的计算机已经安装了带有MinGW的CodeBlock,如果没有可以去下载http://www.codeblocks.org/downloads/26

    点击windows左下角开始---->运行,输入cmd进入命令行,在命令行中进入CodeBlock的MinGW文件夹,运行windows批处理文件 mingwvars.bat 。效果如下图所示:

    这样的效果就说明mingwvars.bat批处理文件运行了。

    我们再进入要被编译的文件“1.c”所在的文件夹,输入"gcc 文件名"也就是“gcc 1.c”,这样1.c就被编译了。

    此时,我们会发现在1.c所在的文件夹下会生成一个名为“a.exe”的可执行文件,我们输入"a.exe"执行它,就能执行1.c里所写的程序:

    记事本编程几个字,就是printf输出的结果。

    1.3 使用Visual Studio自带的编译器编译。

    假设你已经安装了Visual Studio(我的版本是2012),在windows的开始菜单中找到Visual Studio文件夹——>打开开发人员工具“——>

    通过命令行进入1.c所在文件夹——>输入cl 1.c ——>你就能够在1.c所在文件夹下看到生成了1.exe 和 1.obj两个文件——>输入1.exe运行它

    我们就能看到执行的效果了。

    通过上面的两个例子我们可以知道,.c文件是可以通过命令行调用编译器的编译命令执行的,因此我们只需要在程序中调用编译器指令,就能DIY一款自己的C/C++ IED

    二. C/C++ IDE开发流程

    2.1 建立工程

    我们在Visual Studio下新建一个MFC应用程序工程,选择”多个文档“,勾上”选项卡式文档“,项目类型选择”Office“,视觉样式和颜色选择”office 2007 浅绿色“(你可以选自己喜欢的颜色),

    文件扩展名输入”c“,并且勾选文件类型的预览处理支持、缩略图支持、搜索处理支持

    用户界面功能 选择使用功能区,并且勾上所有选项,

    高级功能全部勾选

    基类选择CRichEditView

    点击完成,建立好工程。

    2.2 界面编辑

    在工程的资源视图中找到Ribbon,双击IDR_RIBBON,编辑选项卡,我们从工具栏里拖拽一个类别到选项卡中,这个类别的Caption属性改为”编译“,并且往这个选项卡中拖拽一个面板,这样这个类别就有两个面板了,分别修改其Caption属性问GCC和VC——>再分别往两个面板中拖入两个按钮,Caption设置为”运行“。

    这样界面就完成了。

    2.3 将我们的编译器的文本设置为纯文本

    如果,此时运行程序,用我们的编译器并且写一段文本并且保存,再在记事本中打开文本的话,可以发现有很多多余的文本,这些是用于记录文字样式等信息的文本,这是不能编译的(不信你可以试试,我就不上图了),因此我们要设置编译器保存的文本问纯文本。

    如果不理解,只要跟着做就行。

    在工程中打开MyIDEDoc.cpp,找到void CMyIDEDoc::Serialize(CArchive& ar)这个函数,我们可以看到最下面有一行注释

    // TODO: 如果作为文本进行序列化,则设置 CRichEditDoc::m_bRTF = FALSE

    我们只需要把代码移动到下一行并且加上”;“即可:

     1 void CMyIDEDoc::Serialize(CArchive& ar)
     2 {
     3     if (ar.IsStoring())
     4     {
     5         // TODO: 在此添加存储代码
     6     }
     7     else
     8     {
     9         // TODO: 在此添加加载代码
    10     }
    11 
    12     // 调用基类 CRichEditDoc 将启用
    13     //  容器文档的 COleClientItem 对象的序列化。
    14     // TODO: 如果作为文本进行序列化,则设置 
    15     CRichEditDoc::m_bRTF = FALSE;
    16     CRichEditDoc::Serialize(ar);
    17 }

    此时,保存的就是纯文本了。

    2.4 实现简单的MinGW编译

    我们的核心技术就是要运行MinGW的批处理文件,驱动编译

    首先我们打开CodeBlock的MinGW文件夹,为了不影响CodeBlock本身的编译,我们复制一份新的 mingwvars.bat 并且命名为 mingwvars_A.bat,用记事本将其打开,并且添加如下命令:

    1 @echo.
    2 @echo Setting up environment for using MinGW with GCC from %~dp0.
    3 @set PATH=%~dp0bin;%PATH%
    4 
    5 c:
    6 cd C:UsersAdministratorDesktop
    7 gcc 2.c
    8 a.exe

    意思是,进入要编译的文件所在文件夹,编译名为”2.c“的文件,然后执行它。

    接着我们添加事件处理程序

    在VS工程中,右键点击GCC的”运行“按钮,点击”添加事件处理程序“,类列表选择”CMianFrame“——>点击添加编辑

    然后我们在按钮的事件处理程序中加入代码:

    1 void CMainFrame::OnButton2()
    2 {
    3     // TODO: 在此添加命令处理程序代码
    4     system(""D:\CodeBlocks\MinGW\mingwvars-A.bat"");
    5 }

    把路径改成你的minGW所在文件夹,文件名改成你自定义的批处理文件名即可。

    然后我们运行工程——>进入界面——>选择左上角的编译——>在文件编辑框内随便输入一些代码,保存到之前设置的批处理文件所要编译的文件夹,保存为"2.c",你也可以取别的名,改批处理文件即可,这是简单的例子,你也可以通过写入文件编译任何文件名的文件。

    ——>点击GCC的运行

    我们看到执行了。

    2.5 实现简单的VC编译器

    首先我们进入Vs安装目录文件夹下的VC文件夹,跟调用minGW一样,我们找到VC的批处理文件vcvarsall.bat,复制一份,重命名为vcvarsall-A.bat——>编辑——>在:x86下的

    call "%~dp0binvcvars32.bat" 与 goto :SetVisualStudioVersion之间添加代码:

    :x86
    if not exist "%~dp0binvcvars32.bat" goto missing
    call "%~dp0binvcvars32.bat"
    
    C:
    cd C:UsersAdministratorDesktop
    cl 2.c
    2.exe
    
    goto :SetVisualStudioVersion

    保存,意思是,进入C:UsersAdministratorDesktop文件夹也就是桌面,然后编译2.c这个文件,然后执行编译好的2.exe文件。

    接着我们在VS工程的VC 的” 运行“按钮下添加事件处理程序(方法同上):

    1 void CMainFrame::OnButton3()
    2 {
    3     // TODO: 在此添加命令处理程序代码
    4     system(""F:\Microsoft Visual Studio 11.0\VC\vcvarsall-A.bat"");
    5 
    6 }

    运行工程,添加2.c文件夹,点击VS版面下的运行,得到下面的效果:

    在2.c文件夹下我们会发现2.obj和2.exe文件。

    这样就简单的实现了一款C/C++的IDE

  • 相关阅读:
    Ajax
    对于本地上关联了远程的git上的项目,删除现有的关联,然后关联新创建的git项目
    UNI-APP_uni-simple-router的快速上手(路由,nui路由拦截)
    js之观察者模式和发布订阅模式区别
    Vue CLI 3.0脚手架如何在本地配置mock数据
    es6解构赋值和扩展运算符
    js Array数组详细操作方法及解析合集
    list排序
    java常用的object数据处理
    java 读写 txt 文件
  • 原文地址:https://www.cnblogs.com/yingjiehit/p/4395766.html
Copyright © 2020-2023  润新知