Sublime Text 3 配置c/c++編譯環境

來源:互聯網
上載者:User

標籤:版本   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++編譯環境(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.