DIY一款C/C++編譯器

來源:互聯網
上載者:User

標籤:

一. 原理

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:\Users\Administrator\Desktop7 gcc 2.c8 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 "%~dp0bin\vcvars32.bat" 與 goto :SetVisualStudioVersion之間添加代碼:

:x86if not exist "%~dp0bin\vcvars32.bat" goto missingcall "%~dp0bin\vcvars32.bat"C:cd C:\Users\Administrator\Desktopcl 2.c2.exegoto :SetVisualStudioVersion

儲存,意思是,進入C:\Users\Administrator\Desktop檔案夾也就是案頭,然後編譯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

 

DIY一款C/C++編譯器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.