DIY一款C/C++编译器
一. 原理
1.1 记事本编程
我们用记事本新建一个文件,文件后缀改成.c,例如文件名叫做"1.c",在文件里写上最简单的C或者C++代码,
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("记事本编程");
system("pause");
return ;
}
不使用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
我们只需要把代码移动到下一行并且加上”;“即可:
void CMyIDEDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
} // 调用基类 CRichEditDoc 将启用
// 容器文档的 COleClientItem 对象的序列化。
// TODO: 如果作为文本进行序列化,则设置
CRichEditDoc::m_bRTF = FALSE;
CRichEditDoc::Serialize(ar);
}
此时,保存的就是纯文本了。
2.4 实现简单的MinGW编译
我们的核心技术就是要运行MinGW的批处理文件,驱动编译
首先我们打开CodeBlock的MinGW文件夹,为了不影响CodeBlock本身的编译,我们复制一份新的 mingwvars.bat 并且命名为 mingwvars_A.bat,用记事本将其打开,并且添加如下命令:
@echo.
@echo Setting up environment for using MinGW with GCC from %~dp0.
@set PATH=%~dp0bin;%PATH% c:
cd C:\Users\Administrator\Desktop
gcc .c
a.exe
意思是,进入要编译的文件所在文件夹,编译名为”2.c“的文件,然后执行它。
接着我们添加事件处理程序
在VS工程中,右键点击GCC的”运行“按钮,点击”添加事件处理程序“,类列表选择”CMianFrame“——>点击添加编辑
然后我们在按钮的事件处理程序中加入代码:
void CMainFrame::OnButton2()
{
// TODO: 在此添加命令处理程序代码
system("\"D:\\CodeBlocks\\MinGW\\mingwvars-A.bat\"");
}
把路径改成你的minGW所在文件夹,文件名改成你自定义的批处理文件名即可。
然后我们运行工程——>进入界面——>选择左上角的编译——>在文件编辑框内随便输入一些代码,保存到之前设置的批处理文件所要编译的文件夹,保存为"2.c",你也可以取别的名,改批处理文件即可,这是简单的例子,你也可以通过写入文件编译任何文件名的文件。

——>点击GCC的运行

我们看到执行了。
2.5 实现简单的VC编译器
首先我们进入Vs安装目录文件夹下的VC文件夹,跟调用minGW一样,我们找到VC的批处理文件vcvarsall.bat,复制一份,重命名为vcvarsall-A.bat——>编辑——>在:x86下的
call "%~dp0bin\vcvars32.bat" 与 goto :SetVisualStudioVersion之间添加代码:
:x86
if not exist "%~dp0bin\vcvars32.bat" goto missing
call "%~dp0bin\vcvars32.bat" C:
cd C:\Users\Administrator\Desktop
cl .c
.exe goto :SetVisualStudioVersion
保存,意思是,进入C:\Users\Administrator\Desktop文件夹也就是桌面,然后编译2.c这个文件,然后执行编译好的2.exe文件。
接着我们在VS工程的VC 的” 运行“按钮下添加事件处理程序(方法同上):
void CMainFrame::OnButton3()
{
// TODO: 在此添加命令处理程序代码
system("\"F:\\Microsoft Visual Studio 11.0\\VC\\vcvarsall-A.bat\""); }
运行工程,添加2.c文件夹,点击VS版面下的运行,得到下面的效果:

在2.c文件夹下我们会发现2.obj和2.exe文件。
这样就简单的实现了一款C/C++的IDE
DIY一款C/C++编译器的更多相关文章
- 哪款C语言编译器(IDE)适合初学者?
这里我们把“编译器”和“IDE(集成开发环境)”当做一个概念,不再加以区分. C语言的集成开发环境有很多种,尤其是 Windows 下,多如牛毛,初学者往往不知道该如何选择,本节我们就针对 Windo ...
- C/C++开发者必不可少的15款编译器+IDE
1)Best IDE for C/C++ – kDevelop(http://kdevelop.org/) Kdevelop是一个专为C/C++及其他语言的开源扩展插件IDE.它基于KDevPlat ...
- IntelliJ IDEA 2017版 编译器使用学习笔记(一) (图文详尽版);IDE快捷键使用;IDE多行代码同时编写
IntellJ是一款强大的编译器,那么它有很多实用的功能 一.鼠标点击减少效率,快捷键实现各种跳转 (1)项目之间的跳转 快捷键位置: 操作:首先要有两个项目,然后,在不同窗口打开:如图: 然后使用快 ...
- 7款易上手C语言编程软件推荐
C语言是一门历史很长的编程语言,其编译器和开发工具也多种多样,其开发工具包括编译器,现举几个开发工具供大家选择,当然也要根据自己的操作系统来选择适合自己的开发工具. 好多刚开始接触c语言的朋友都想知道 ...
- 为编译器的实现者提供一个精确的定义:ANSI C
编译器的实现 常用C++编译器推荐_w3cschool https://www.w3cschool.cn/cpp/cpp-zxm72ps8.html 常用C++编译器推荐 由 Alma 创建, 最后一 ...
- 基于树莓派2代的DIY无线路由器
最近手上多了一个树莓派2代,于是折腾就这么开始了. 因为总是得要个显示屏或者路由器或者插根网线才能玩,有点麻烦,所以有了此文. 设备清单: 树莓派2代 EDUP EP-N8508GS无线网卡(USB) ...
- c语言1
1.c语言的执行过程: 源代码:source code,使用某种计算机语言书写的代码. 编译:compile 对源代码进行翻译的过程. 编译器:compiler 负责编译工具. gcc:一款通用的编译 ...
- 用Sublime Text搭建简易IDE编写Verilog代码
前言 Verilog是一种硬件描述语言(HDL),该语言在Windows上有集成开发环境可以使用,如ModelSim,但ModelSim的编辑器不太好用因此笔者萌生了用Sublime Text3来编写 ...
- art-template引擎模板
art-template简介 artTemplate(后文简称aT)才是模板引擎,而TmodJS(后文简称TJ,曾用名atc)则是依赖于前者的一款模板预编译器.两者都是由腾讯开发.其实aT完全可以独立 ...
随机推荐
- C语言学习--全局变量、静态本地变量
全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数无关 在任何函数内部都可以使用它们 #include <stdio.h> int f(v ...
- [转]C# FileSystemWatcher监控指定文件或目录的文件的创建、删除、改动、重命名等活动
觉得这个很常用..比如一些软件. http://www.rabbit8.cn/DoNet/407.html FileSystemWatcher控件主要功能: 监控指定文件或目录的文件的创建.删 ...
- Xamarin for OSX – SetUp
正常情况联网会失败 按照安装顺序进行安装(mono framework->java sdk-> android sdk->xamarin studio->xamarin.and ...
- 值得IT运维人员警示的“一件事儿”
昨天,一个用户打来了紧急求助电话,并且发了邮件,弄得我当时紧张了一下,以为他们那里又出了什么乱子.用户在电话里说:应用系统性能很差,运行很慢,几近“卡死”的感觉,而且重启了多次应用和数据库服务器,最终 ...
- -_-#【Canvas】绘制文本
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 无向图求割点 UVA 315 Network
输入数据处理正确其余的就是套强联通的模板了 #include <iostream> #include <cstdlib> #include <cstdio> #in ...
- app开发历程——android手机显示服务器端图片思路
以前自己都不知道怎么去显示服务器端的图片,还好在apkbus论坛上找到一个特别简单的例子.虽然一天天忙忙碌碌,但是自己内心其实有一种想逃的心里,说不定哪天就会冒出来. 1.首先服务器端图片 这里的Im ...
- Largest Number——LeetCode
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- HTTP学习笔记7-消息报头
41,消息报头-实体报头 请求和响应消息可以传送一个实体.一个实体由实体报头域和实体正文组成,在大多数情况下,实体正文就是请求消息中的请求正文或者响应消息中的响应正文.但是在发送时,并不是说实体报头域 ...
- Asp.Net Mvc+Angular.Js自测小Demo
参考:http://www.cnblogs.com/eedc/p/6082052.html 一.引用anguler: 1.angular.js 2.angular-route.js 3.app.js ...