zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    AcWing 1135. 新年好 图论 枚举
    uva 10196 将军 模拟
    LeetCode 120. 三角形最小路径和 dp
    LeetCode 350. 两个数组的交集 II 哈希
    LeetCode 174. 地下城游戏 dp
    LeetCode 面试题 16.11.. 跳水板 模拟
    LeetCode 112. 路径总和 递归 树的遍历
    AcWing 1129. 热浪 spfa
    Thymeleaf Javascript 取值
    Thymeleaf Javascript 取值
  • 原文地址:https://www.cnblogs.com/yingjiehit/p/4395766.html
Copyright © 2011-2022 走看看