1. 程式人生 > >sublime編譯c

sublime編譯c

   之前用codeblocks寫c++,感覺c++語法很麻煩而且codeblocks介面和字型又不好看,所以一直不喜歡用c++寫程式碼。最近感覺很有必要轉一下c++,就在網上找更好看的編輯器,無奈vim和emacs上手都很慢,就找到了sublime text,感覺介面字型真的很棒棒啊,就愉快地決定以後用它寫c++了。

   sublime text給使用者留下了很大的配置空間,c/c++的程式碼在windows下編譯執行需要呼叫的外部命令,可以理解為執行一段cmd命令,這個是通過build配置檔案實現的。編輯器自帶了一個叫c++ single file的build檔案,但是它是不支援標準輸入的,所以我們需要自己寫一個配置檔案。網上關於這個有很多的部落格,但很多都是隻給出了一段程式碼讓粘上,我一開始試了很多都會報錯,沒辦法只好學習一下自己寫一個嘍。由於我太辣雞,之前很少研究配置檔案、指令碼、cmd命令這些東西,所以這個過程摸索了很久才真正搞清楚。這裡想寫一篇真正詳細的配置方案。

   下面的內容是我在windows下配置的,linux的配置檔案應該是類似的,iOS我就沒有試過了。

一、安裝MinGW和新增環境變數

   為什麼要安裝這個呢?MinGW是Minimalist GNU on Windows的縮寫,裡面包含了c++的編譯器,但這不是重點,重點是它可以讓我們在windows下用linux的命令編譯執行c++程式,也就是說這個不裝應該也是完全可以的,只要有c++編譯器就可以了,但是你就必須用windows的命令了,我稍微看了一眼命令完全不熟悉,所以也就沒有再去研究這個。下面的討論都是在安裝了MinGW基礎上的做法。

   我之前電腦上之前裝了codeblocks,所以就直接從它的目錄裡面複製了出來。據說直接在官網上下載MinGW會出很多問題,這裡不去討論那些問題。建議大家也直接下一個codeblocks,用它自帶的MinGW,這樣會省很多時間。

   我把MinGW放在了C盤的根目錄,然後需要把C:\MinGW\bin加入到環境變數Path中,這一部分就結束了。之前配過Java環境變數的話應該懂的,不懂的話可以百度一下。

   完成以後在cmd任意目錄下輸入gcc,應該如下圖:


   如果提示不是內部或外部命令,說明配置失敗。

   之後,重啟sublime text 就可以生效了,如果在sublime中未生效,據說可以嘗試重啟windows。

二、編寫Build配置檔案

   在這之前需要大家瞭解linux下的c++編譯和執行命令,這裡說幾個我之前不很清楚的地方。

   首先,g++和gcc都是可以編譯c++的編譯器,兩者的關係大家百度一下吧,結論就是用g++就好。

   然後,-std=c++11或者-std=c++0x是新增g++的編譯選項,都是指2011年釋出的一套c++標準,命令中可以沒有,也可能引發一些玄學錯誤。

   然後,-Wall也是一個選項,加上可以顯示警告。

   沒有接觸過linux編譯執行c++的可以先補習一下再繼續。

   之後就到了最關鍵的地方,需要新建一個Build System,選擇Tools-->Build System-->New Build System,就會開啟一個sublime-build檔案。

   下面是我最後使用的一段程式碼:

{
	"cmd":"g++ -std=c++11 $file_name -o $file_base_name",
	"file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
	"working_dir": "${file_path}",
	"selector": "source.c, source.c++",
	"shell": true,
	"encoding":"cp936",
	"variants":[
		{
			"name":"g++ Compile",
			"cmd":"g++ -std=c++11 $file_name -o $file_base_name"
		},
		{
			"name":"g++ Run",
			"cmd":"start cmd /k $file_base_name"
		}
	]
}


   如果上面的步驟都沒問題的話,粘上應該是可以直接用的。

   下面詳細地解釋一下配置檔案。一個比較官方的說明:http://sublimetext.info/docs/en/reference/build_systems.html。

   這個配置檔案是用JSON寫的,關於JSON的語法非常簡單,大家搜一下教程吧。

   解釋一下各名稱的含義。用一下從我之前看的一篇部落格上的表格吧。



   之前在其他部落格上找的程式碼問題都出在了cmd上,其中使用變數的習慣都不一樣,而且我對JSON也不瞭解,所以在這摸索了很長時間。

   1.首先,$file吧,也可以寫成${file},執行的時候應該是直接用變數所代表的字串來替代。

   2.我見到有的地方這樣寫${file_path}/${file_base_name},去掉大括號也是沒有問題的,中間的/是轉義字元,替代以後這個就可以成為C:\Files\chapter1這樣的形式。

   3.我試過一個部落格上寫的這樣一句

“cmd”: [“g++”, “ f i l e " , " s t d = c + + 11 " , " o " , " {file}", "-std=c++11", "-o", " {file_path}/${file_base_name}”] 是可以的,換成我後來寫的

“cmd”:“g++ -std=c++11 $file_name -o $file_base_name” 也沒有問題,但是

“cmd”:"g++ -std=c++11 $file -o f i l e p a t h / file_path/ file_base_name"就不對,這個問題讓我困惑了好久。

   原因是這樣,在JSON中,方括號代表陣列,我之前一直以為會被當成一個完整的字串,但實際上這個陣列中的每一項都作為一個單獨的引數給cmd處理,而沒有方括號的寫法是把引號裡面$開頭的變數替換掉,然後整個作為一條命令傳給cmd。拿編譯hello.cpp來舉例吧,第三種會把"g++ -std=c++11 C:\my files\hello.cpp -o C:\my files\hello"傳給cmd,路徑中出現了空格,cmd把"C:\my"當成了一個引數,所以找不到指定檔案,而第一種是把"C:\my files\hello.cpp"整個作為一個引數。前面表格中提到了working_dir會先把cmd轉到檔案所在的目錄下,所以省去路徑就可以,第二種寫法也是可以的。

   4.然後是執行的cmd怎麼寫,一般是"start cmd /k hello",hello後面有沒有.exe都可以,start cmd 是在原來的cmd基礎上重新開啟一個新的cmd,目錄還是在當前目錄,在新的cmd上執行hello這個可執行檔案。後面的/k有的人也寫/c,區別是/k的話執行完程式cmd不會關閉,不然效果就是hello出來一閃,視窗就關了。有的部落格還在後面加了“echo. & pause",百度到的解釋:




   5.如果想編譯並執行的話,用&&連線兩條命令就好了,像這樣"g++ -std=c++11 $file_name -o $file_base_name && start cmd /k $file_base_name"。中間的&&也有些人寫成&,區別是&&後面的命令必須在順利執行完前面的命令的基礎上才會執行,而&後面的命令即使前面的命令沒有順利執行也會執行。

   6.最後,解釋一下variants,這個是備選指令,按照我的程式碼Ctrl+Shift+B就可以看到g++,g++ Compile,g++ Run,三個選項,name就是選項的名字,cmd當然是這個選項下執行什麼了,通過這個域,你可以把編譯和執行分開。

   7.其他幾個域,都沒什麼,直接照搬就可以,前面講的cmd可以按照自己的個性進行設定。

   檔案寫好以後,Ctrl+S儲存就可以使用了,最好儲存在彈出視窗原來給出的那個目錄下,不然有可能出現玄學錯誤。

作者:AC_Machine
來源:CSDN
原文:https://blog.csdn.net/AC_Machine/article/details/60765491?utm_source=copy