標籤:版本 std list 右鍵 download c語言 alt 原始碼 命令列
sublime text 3提供了構建功能,它的構建系統(Build systems)可以運行一段外部命令,還可以捕獲輸出並顯示。
要在sublime text 3中實現c或c++代碼的編譯和運行,在本質上說也是調用外部的命令,windows中也可以理解為執行一段cmd命令。
目前c/c++編譯器最流行的就是gcc和g++,本文將從MinGW開始,介紹gcc和g++的基本命令格式,然後詳細介紹sublime中內建的編譯設定檔,分析每一行的作用。然後給出win7 64bit下 Sublime Text 3 build 3083版本中編譯c語言、c++的build設定檔。
另外,文章最後還介紹了sublime中使用make的內容,以及討論關於中文編碼的問題。
如果你只想快速配置好編譯環境,而對實現細節並不關心(不建議),你可以只閱讀 安裝MinGW、配置環境變數 和 編寫自己的編譯設定檔這幾節。
關於gcc和g++
安裝編譯器是後面所有工作的基礎,如果沒有編譯器,後面的一切都無從談起。在windows下使用gcc和g++,是通過安裝MinGW實現的。
安裝MinGW
MinGW是Minimalist GNU on Windows的首字母縮寫,安裝後就可以使用很多的GNU工具。GNU(GNU’s Not Unix)是linux中的一個著名的項目,包含了gcc\g++\gdb等工具。也就是說,安裝MinGw後,我們就可以使用gcc和g++命令了。
MinGW的官網是 http://www.mingw.org/ ,但是從官網安裝很麻煩,線上安裝經常龜速容易失敗。
雅樂網推薦的方法是藉助codeblocks,選擇帶有mingw的版本安裝,安裝後把mingw檔案夾複製出來就可以了。
這裡提供瞭解壓版的MinGW,是使用 codeblocks-13.12mingw-setup 安裝後複製出來的:
http://pan.baidu.com/s/1gd5YzVP
解壓後,可以在 MinGW/bin 目錄下找到我們需要的gcc.exe和g++.exe 。
我這裡把MinGW檔案夾放到c盤根目錄
在cmd中使用gcc
假設我們有一個test.c檔案在Z盤的work目錄下。首先我們要在cmd中進入此目錄。方法可以是在work目錄空白處按住Shift點擊滑鼠右鍵,選擇“在此處開啟命令視窗”;也可以使用cd命令進入。
gcc的一般格式是
gcc 源檔案名稱 -o 可執行檔名
但是我們輸入命令
gcc test.c -o test
執行後卻提示
‘gcc’ 不是內部或外部命令,也不是可啟動並執行程式或批次檔。
這是因為命令執行時,會在目前的目錄下尋找名為gcc的可執行檔,如果查不到就在系統內容變數path記錄的路徑裡尋找gcc可執行檔。但是目前這兩個地方都沒有。我們的gcc檔案所在的目錄是c盤下的MinGW/bin。
這時可以使用絕對路徑來調用gcc可執行檔
Z:\work>c:/MinGW/bin/gcc test.c -o test Z:\work>test.exehello world
這樣就成功編譯產生了可執行檔test.exe,然後就可以在cmd裡運行了。
配置環境變數
為了方便,一般我們會把gcc所在的路徑加入系統的環境變數,這樣就可以直接使用gcc命令而不用絕對路徑。
右鍵電腦->屬性->進階系統設定->環境變數
在path的值中,可以發現有一些目錄,他們之間用英文的分號分隔。我們雙擊path,把我們gcc的路徑 C:\MinGW\bin 添加進去。 要注意前後的英文分號。
確定以後 就可以在任意目錄下直接使用gcc命令了。可以在任意目錄開啟cmd視窗,輸入gcc查看環境變數是否設定成功。如果仍然提示不是內部或外部命令,說明環境變數設定失敗。
注意:在sublime text 3 build 3083中,環境變數的修改不會立即在sublime中生效,需要重啟windows。
cmd編譯運行c語言
總結一下流程:
首先我們要在cmd中進入.c檔案所在的目錄作為工作目錄
然後執行gcc source.c -o dest來產生可執行檔
最後輸入產生的可執行檔名來運行產生的程式。
建議大家加入-Wall選項,開啟常用的警告。
下面是幾種常用的命令:
編譯c語言
gcc -Wall 源檔案名稱 -o 可執行檔名
編譯c++語言
g++ -Wall 源檔案名稱 -o 可執行檔名
調試c++
g++ -g 源檔案名稱 -o 可執行檔名gdb 可執行檔名
Sublime Text 3預設c/c++編譯設定檔詳解
把g++加入環境變數後,sublime中預設的編譯系統就可以正常使用了。
我們在Sublime Text 3中開啟一個cpp檔案,按Ctrl+B
這是sublime內建的預設c++編譯命令。第一個是編譯,第二個是運行。這時候是可以正常使用的。(環境變數配置後需重啟windows)
Sublime Text 3 3080版本之後修改了編譯系統,具體設定是
Ctrl+B 執行改格式上次的編譯命令。如果第一次執行則提示選擇執行哪個
Ctrl+Shift+B 選擇執行哪個
不足之處:
1. 程式輸出捕獲到Sublime視窗中,這樣導致不能運行時輸入資訊。執行含有scanf語句的代碼會卡住。
2. 預設情況下c和c++沒有進行區分,全部當做c++格式來處理了。
解決辦法
第一個是設定在新的cmd視窗執行程式,這樣就可以輸入資訊。
第二個是針對c語言單獨寫一個build設定檔。
預設的編譯設定檔位置
在Sublime的安裝目錄的Packages檔案夾中,有個檔案叫C++.sublime-package
這個實際上是zip的壓縮包,裡麵包含了c++的預設系統設定,修改尾碼名為zip後解壓,可以在裡面找到C++ Single File.sublime-build檔案。
這個檔案名稱就是上面要編譯時間可以選擇的名字
編譯設定檔詳解
這個檔案內容如下:
{"shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\"","file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$","working_dir": "${file_path}","selector": "source.c, source.c++", "variants":[{"name": "Run","shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""}]}
這個JSON格式的設定檔就是sublime中build檔案的真面目了。花括弧裡面是一個個的索引值對,它們之間用逗號隔開。鍵和值中間是一個冒號。為了方便下面把鍵稱為名稱。
名稱和值都要用雙引號括起來,因此值裡面用到雙引號的話,就要用轉義 \” (反斜線+雙引號)表示。
這裡面用到的名稱的含義如下:
名稱 |
含義 |
working_dir |
運行cmd是會先切換到working_dir指定的工作目錄 |
cmd |
包括命令及其參數。如果不指定絕對路徑,外部程式會在你系統的:const:PATH 環境變數中搜尋。 |
shell_cmd |
相當於shell:true的cmd ,cmd可以通過shell運行。 |
file_regex |
該選項用Perl的Regex來捕獲構建系統的錯誤輸出到sublime的視窗。 |
selector |
在選定 Tools | Build System | Automatic 時根據這個自動選擇編譯系統。 |
variants |
用來替代主構建系統的備選。也就是一個設定檔可以對應多個執行命令 |
name |
只在variants下面有,設定命令的名稱,例如Run。 |
上面的設定檔中還有一些類似 ${file} 這種符號,這是sublime提供的變數,一些常用的變數如下:
變數 |
含義 |
$file_path |
當前檔案所在目錄路徑, e.g., C:\Files. |
$file |
當前檔案的詳細路徑, e.g., C:\Files\Chapter1.txt. |
$file_name |
檔案全名(含副檔名), e.g., Chapter1.txt. |
$file_extension |
當前副檔名, e.g., txt. |
$file_base_name |
當前檔案名稱(不包括副檔名), e.g., Document. |
變數的使用可以直接使用,也可以使用花括弧括起來,例如 ${project_name}
我們詳細看一下這個檔案。
"working_dir": "${file_path}",
這一行說明工作目錄,也就是執行命令時所在的目錄,被設定為檔案所在的目錄。
下面的
"shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\"",
這就是編譯時間執行的命令了,它的值的部分是
g++ \"${file}\" -o \"${file_path}/${file_base_name}\"
執行時,${file}會被替換為編輯的檔案名稱,${file_path}/${file_base_name} 就會被替換為不包含副檔名的完整路徑名。它們前後有\”雙引號是為了支援帶空格的檔案名稱。
假設我們編輯的檔案路徑為 Z:/cpp/t.cpp ,那麼執行時的工作目錄就是 Z:/cpp 。${file} 就是 Z:/cpp/t.cpp ,${file_path} 就是 Z:/cpp ,${file_base_name} 就是 t 。我們把逸出字元雙引號也用雙引號表示,這樣執行的命令就變成了
g++ "Z:/cpp/t.cpp" -o "Z:/cpp/t"
這正好是編譯檔案的命令,檔案路徑前後的雙引號保證它支援帶空格的路徑。編譯後產生的可執行檔和原始碼檔案在一個目錄下,名字相同(副檔名不同)。
如果有編譯錯誤,錯誤資訊就會被”file_regex”中的Regex匹配並顯示。
再來看最後面的代碼
"variants":[{"name": "Run","shell_cmd": "g++ \"${file}\" -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""}]
variants的值是一個數組,可以放很多個對象,每個對象表示一個命令。裡面name表示了這個命令的名稱為Run,也就是運行。編譯時間選擇C++ Single File-Run就會執行這裡面的shell_cmd。
運行部分的命令前半部分和編譯一樣,後面用 && 串連了另一個命令,&&表示編譯成功才執行後面的部分。後面為
\"${file_path}/${file_base_name}\"
也就是直接運行可執行檔了。這樣是在sublime中捕獲運行結果的。
看懂這個預設設定檔後,照葫蘆畫瓢,我們很容易的就可以寫出符合自己需要的設定檔。
但是不建議直接修改這個檔案,建議大家把使用者配置放到使用者檔案夾下,來代替預設的編譯配置。
編寫自己的編譯設定檔c語言
選擇tool –> Build System –> New Build System
然後輸入以下代碼
{"working_dir": "$file_path","cmd": "gcc -Wall \"$file_name\" -o \"$file_base_name\"","file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$","selector": "source.c", "variants": [{"name": "Run", "shell_cmd": "gcc -Wall \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""}]}
和預設相比,就是修改了selector部分為只選擇.c檔案。Run中的shell_cmd後面部分加上了start cmd /c,start作用是新開一個cmd視窗,cmd表示要執行一個命令列,/c執行完後退出新開的視窗,後面的& pause保證運行結束後視窗不會立即退出。這樣Run就會在新的cmd視窗中運行了。
按Ctrl+s儲存,會自動開啟user目錄(Sublime Text 3\Packages\User),我們修改 檔案名稱為 c.sublime-build,儲存在此目錄。
這時候,可以在Tools -> Build System下看到剛才建立的c了
選中後就可以使用了。
Build System中除了選擇具體的編譯系統,還可以選擇第一個:Automatic 自動選擇,會根據開啟的檔案尾碼自動選擇。由於預設情況下.c檔案sublime識別為c++類型,所以使用自動選擇的時候還需要修改一點:
先用sublime開啟.c檔案的時候 預設是c++格式 。(註:最新的3013版本已經預設是c格式,則不必修改)
點擊紅色箭頭處的c++ 選擇Open all with current extension as .. 然後選擇C
這樣以後開啟.c檔案就預設是c類型
這時候按Ctrl+Shift+B
第三個c就是對應執行設定檔中的第三行 gcc -Wall $file_name -o $file_base_name 作用是編譯。
第四個c-Run對應後面的命令 gcc -Wall $file -o $file_base_name && start cmd /c \”${file_path}/${file_base_name} & pause\” ,作用是是在新的cmd視窗運行。這樣就可以對scanf等函數進行輸入了。
c++
gcc雖然可以編譯c++代碼,但是不能進行c++的串連函數庫操作。所以針對c++代碼一般使用g++來編譯。
方法和上面的c語言的配置一樣,只要把設定檔中的gcc改為g++ ,source.c改為source.c++ ,儲存檔案名稱c.sublime-build改為c++.sublime-build就可以了。
這裡增加了-std=c++11 選項,是按照C++11標準進行編譯,不需要的話可以去掉,設定檔如下
{"encoding": "utf-8","working_dir": "$file_path","shell_cmd": "g++ -Wall -std=c++11 \"$file_name\" -o \"$file_base_name\"","file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$","selector": "source.c++", "variants": [{"name": "Run", "shell_cmd": "g++ -Wall -std=c++11 \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""}]}
實際上,我們可以利用Varians ,來配置多個不同的編譯命令。
下面的設定檔有編譯 ,編譯並在sublime中運行,編譯並cmd運行 和 gdb調試 四個命令。
註:gdb調試是開啟命令列的方式,這裡不支援帶空格的原始碼檔案名稱和路徑,gdb的使用可以參考:gdb調試新手入門(一) | 雅樂網 。 要想通過sublimeGDB外掛程式實現圖形化調試,可以參考Sublime Text 3 使用 SublimeGDB 圖形化調試c/c++程式。
{"encoding": "utf-8","working_dir": "$file_path","shell_cmd": "g++ -Wall -std=c++11 \"$file_name\" -o \"$file_base_name\"","file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$","selector": "source.c++", "variants": [{"name": "Run in sublime", "shell_cmd": "g++ -Wall -std=c++11 \"$file_name\" -o \"$file_base_name\" && cmd /c \"${file_path}/${file_base_name}\""},{"name": "CMD Run", "shell_cmd": "g++ -Wall -std=c++11 \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""},{"name": "gdb Debug", "shell_cmd": "g++ -g -std=c++11 \"$file\" -o \"$file_base_name\" && start cmd /c gdb ${file_path}/${file_base_name} & pause"}]}
使用makefile編譯多個檔案
sublime可以使用makefile來編譯多個檔案,以便支援稍大一點的工程項目。(windows下面和linux下面並不相同,本文介紹適用於windows)
這個功能只開啟單個檔案是沒有的,只有開啟整個檔案夾
側邊欄中可以看到開啟的檔案夾,確保檔案夾中包含makefile檔案。此時按下Ctrl+Shift+B ,會有make的選項。
這裡make選項執行的是make,但是windows中是沒有make這個命令的。MinGW\bin裡面的名字是mingw32-make.exe 。解決辦法是修改這個檔案名稱改為make.exe ,或者自己建立一個makefile的build檔案。
makefile的預設編譯設定檔在”C:\Program Files\Sublime Text 3\Packages\Makefile.sublime-package”,解壓後的Make.sublime-build檔案中。
我們建立一個編譯系統,tool –> Build System –> New Build System,內容為
註:該檔案在sublime 3126版本測試通過,低版本可能不支援keyfile關鍵字,或者沒有Packages/Makefile/Make Output.sublime-syntax檔案,可以升級或嘗試刪除這些行
{"shell_cmd": "mingw32-make","file_regex": "^(..[^:\n]*):([0-9]+):?([0-9]+)?:? (.*)$","working_dir": "${folder:${project_path:${file_path}}}","selector": "source.makefile","syntax": "Packages/Makefile/Make Output.sublime-syntax","keyfiles": ["Makefile", "makefile"], "variants":[{"name": "Clean","shell_cmd": "mingw32-make clean"},{"name": "Run","shell_cmd": "mingw32-make run"},]}
儲存為mingw32-make.sublime-build,儲存位置和上面c++設定檔位置相同就可以了。
然後開啟檔案夾後,如果裡面有Makefile或makefile檔案,就會有對應的命令
由於windows下面常用命令和linux不同,makefile也要做對應的修改:
makefile樣本
下面是一個簡單的樣本:
現在有一個test檔案夾,裡面有4個檔案
其中main.cpp用到了func.cpp中的函數。具體代碼如下:
main.cpp
#include "func.h" int main(){ output(); return 0;}
func.h
void output();
func.cpp
#include <cstdio>void output(){ printf("hello world\n");}
makefile
main : main.cpp func.h func.cpp clean:del main.exe *.o run:mingw32-make && start cmd /c "main.exe & pause"
注意:makefile裡面的clean和run,和我們自己的設定檔裡的”variants”下面的命令mingw32-make clean和mingw32-make run對應的。
clean下面使用命令為del而不是linux下面的rm
另外,由於windows下沒有cc命令,這裡不能出現全部依賴.o檔案的目標。例如不能有這樣的規則:
main : main.o func.o
使用這樣的規則時,會調用cc,但是windows下面cc沒法使用,就會報錯。
在sublime text 3中開啟該檔案夾(注意必須開啟檔案夾,只開啟檔案沒有make選項)
之後使用Ctrl+shift+B 選擇對應的mingw32-make命令即可。
Run對應了編譯並運行。
中文編碼亂碼的問題
感謝RGB0x000000同學指出關於中文編碼的問題。由於Sublime Text 3中檔案預設編碼格式是utf-8 ,而windows中的命令列預設編碼格式是GBK 。所以代碼中出現中文時運行會亂碼。
解決思路也很簡單,就是讓他們編碼一致就可以了。
1. 修改cmd編碼為utf-8
使用chcp命令可以查看當前字元集,預設是936 ,可以使用chcp 65001修改字元集為utf-8
然而似乎只對當前開啟的視窗有效,一個麻煩的辦法是每次代碼裡運行system來切換字元集(噗)
2. 修改原始碼格式為GBK
Sublime原生並不支援GBK編碼,但如果安裝了ConvertToUTF8外掛程式,就可以正確顯示ANSI或者GBK編碼的檔案。因此,裝外掛程式後開啟GBK編碼的原始碼檔案,也不會亂碼。
一個更巧妙地辦法是使用編譯器的選項 -fexec-charset 來設定代碼中字串的編碼,這樣源檔案可以使用utf-8編碼,只是編譯的時候用指定的編碼來編譯原始碼中的字串。
在編譯命令gcc中加入選項 -fexec-charset=GBK 來說明將代碼中的字串按照GBK編碼,從而和CMD視窗一致,也不會亂碼。
修改後的c語言的設定檔如下:
{"working_dir": "$file_path","cmd": "gcc -Wall -fexec-charset=GBK \"$file_name\" -o \"$file_base_name\"","file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$","selector": "source.c", "variants": [{"name": "Run", "shell_cmd": "gcc -Wall -fexec-charset=GBK \"$file\" -o \"$file_base_name\" && start cmd /c \"\"${file_path}/${file_base_name}\" & pause\""}]}
但是加入這個選項後,如果要編譯的不是utf-8 ,而是GBK ,必須還要加入-finput-charset=GBK 選項來制定原始碼的編碼格式,否則會提示錯誤
error: converting to execution character set: Illegal byte sequence。
而加入這個選項後編譯utf-8又會亂碼。。。所以,目前博主還沒找到源檔案是utf-8編碼和gbk編碼兩種情況下中文都不會亂碼的方法。。。
轉自:http://www.yalewoo.com/sublime_text_3_gcc.html
yalewoo
Sublime Text 3 配置c/c++編譯環境(轉)