手動調動編譯器、連結器程式設計
在不同的作業系統和編譯器系統中,執行C++編譯器的命令也不同。最常用的編譯器是GUN編譯器和微軟Visual Studio編譯器。
執行GUN編譯器的命令是g++:$ g++ -o prog1 prog1.cc ,其中$是系統提示符,-o prog1是編譯器引數,指定可執行檔案的檔名。(在UNIX系統中,可執行檔案沒有後綴,在Windows系統中可執行檔案的字尾是.exe)
執行微軟Visual Studio編譯器的命令是cl:c : \user\me\Programs> cl /EHsc prog1.cpp ,其中c : \user\me\Programs>是命令提示符,\user\me\Programs是當前資料夾。命令cl呼叫編譯器,/EHsc是編譯器選項,用來開啟標準異常處理。
編輯器、編譯器和連結器是使用C語言進行開發所需要的三個最基本的工具,而且也是最小的工具集,缺一不可。
1.編輯器
編輯器的作用就是將我們在鍵盤上的敲擊轉換成寫有程式碼的檔案——容器,這個檔案被稱為原始檔。
這個編輯器在形式上很像是一個記事本程式,可以在上面新增、刪除、插入字母或者文字。記事本可以作為C語言編輯器。這些程式碼儲存到一個檔案中,供下次編輯或者直接交給編譯器去處理,這個檔案就是原始檔。
不過,記事本可以算是最簡單和最不專業的C語言編輯器了!一般而言,專業的C語言編輯器都有其他方便C語言程式碼編輯的功能。例如,最基本的語法高亮功能。越高階、越專業的C語言編輯器,越能最大程度地方便你寫C語言程式碼。比如NotePad++。
其實,只要能將鍵盤的輸入轉換成原始檔的就可以稱為編輯器。一般的編輯器也是可以編寫C語言程式碼的,只不過比起專業的C語言編輯器會顯得難用和不舒服一點。
2.編譯器
編譯器的作用是將儲存著程式碼的原始檔,轉換成一種稱為目標檔案的二進位制檔案。原始檔是我們能看懂的,是給我們用的。而二進位制檔案是計算機能看懂的檔案,是給計算機用的。計算機根據二進位制檔案中的內容決定該做什麼事情,不該做什麼事情。
在這個轉換過程中,編譯器先對原始檔中的內容進行掃描,根據C語言的語法要求,逐個檢查原始檔中出現的每一個字母或者文字。
如果這些文字符合C語言的語法要求,那麼它就根據這些字母和文字的含義將其轉換成計算機可以識別的二進位制程式碼,並將其按照一定的格式儲存在二進位制檔案中。如果某些地方的字母或者文字不符合C語言的語法要求,那麼編譯器將報告所有不符合的地方,不再生成二進位制檔案,只有改正所有不符合語法要求的地方,讓編譯器重新對改正的原始檔進行轉化,才可以生成二進位制檔案。
編譯器對原始檔的轉換過程在計算機中有個專業的名字,叫"編譯"。編譯器也因此得名,表示編譯的工具。
3.連結器
一般所寫的程式最終是要執行在某個作業系統上的。因此,即使是一個很簡單的程式也需要作業系統來處理很多事情,才能使程式正常執行。作業系統往往會提供一些被稱為開發庫的二進位制檔案,編譯器產生的目標二進位制檔案只有和這些庫二進位制檔案結合才能生成一個可執行程式,才能使我們寫的程式正常地運行於某個作業系統之上。
連結器所做的工作就是將所有的二進位制檔案連結起來融合成一個可執行程式,不管這些二進位制檔案是目標二進位制檔案還是庫二進位制檔案。連結器將二進位制檔案融合的這一過程,在計算機中也有一個專業的名字--"連結",連結器也因此得名,表示連結的工具。
實戰演練:
1、首先命令列視窗(cmd)進入編譯器、連結器所在資料夾(在你的VS2013安裝目錄下搜尋cl.exe)。cd命令不會修改當前drive,當輸入cd d:時先是出現了d:/,後來在下一行又自動轉調到了初始的目錄。解決辦法:在命令提示符的DOS視窗下直接輸入d:。回車後就可以直接轉跳到D碟符下了。(下面還有一種VS2013提供的更簡潔的方法)
2、在上述資料夾新建“prog1.cpp”檔案,用記事本開啟並編輯。如下圖:
3、接下來看一下整合開發環境中使用的編譯器和連結器。其中,畫圈的兩個就是編譯器和連結器,"cl.exe"是編譯器,"cl"表示"compiler"中的兩個字母,表示編譯,它將程式原始碼檔案編譯為obj檔案;"link.exe"就是連結器,"link"就是連結的意思,link.exe是Windows平臺的連結器,它將cl.exe編譯生成的obj檔案,資源編譯器(rc.exe)生成的.res檔案,以及lib目錄下的lib檔案等連結成可執行的exe檔案、dll檔案等。link.exe是將物件檔案和庫連結起來以建立可執行程式檔案或動態連結庫檔案的工具。link.exe的輸入檔案包括obj檔案、lib檔案、exp檔案、def檔案、res檔案、txt檔案、ilk檔案。輸出檔案是exe檔案、dll檔案、sys檔案等可執行程式檔案。。
4、CL 呼叫連結器(https://msdn.microsoft.com/zh-cn/library/btw8x58e.aspx)
編譯prog1.cpp,出現錯誤:
解決辦法來自:http://blog.csdn.net/zhouyang209117/article/details/17737413
https://msdn.microsoft.com/en-us/library/ms235639.aspx(微軟官方msdn上介紹cl的使用方法是”開始“-”所有程式“-"Visual
Studio 2013"-"Visual Studio Tools"再以管理員身份執行”VS2013開發人員命令提示”)(這種方法也是需要設定環境變數的)
https://msdn.microsoft.com/en-us/library/ff381409(v=vs.85).aspx
按照上述方法設定各種環境變數之後:
進入生成的prog1.exe,顯示程式列印結果:
更復雜的示例(摘自官方):
假設您正在編譯三個 C 原始檔:MAIN.c、MOD1.c 和 MOD2.c。 每個檔案包括對在另外不同檔案中定義的函式的呼叫:
MAIN.c 呼叫 MOD1.c 中的函式 func1 和 MOD2.c 中的函式 func2。
MOD1.c 呼叫標準庫函式 printf_s 和 scanf_s。
MOD2.c 呼叫名為 myline 和 mycircle 的圖形函式,這些函式是在名為 MYGRAPH.lib 的庫中定義的。
要生成此程式,使用下列命令列進行編譯:
CL MAIN.c MOD1.C MOD2.C MYGRAPH.lib
CL 先編譯 C 原始檔,然後建立物件檔案 MAIN.obj、MOD1.obj 和 MOD2.obj。 編譯器將標準庫的名稱放在每個 .obj 檔案中。
CL 將 .obj 檔案的名稱和名稱 MYGRAPH.lib 一起傳遞給連結器。 連結器解析外部引用,如下所示:
在 MAIN.obj 中,使用 MOD1.obj 中的定義解析對 func1 的引用;使用 MOD2.obj 中的定義解析對 func2 的引用。
在 MOD1.obj 中,使用連結器找到的、在 MOD1.obj 內命名的庫中的定義解析對 printf_s 和 scanf_s 的引用。
在 MOD2.obj 中,使用 MYGRAPH.lib 中的定義解析對 myline 和 mycircle 的引用。