(預備知識)
學習Vim: http://www.cnblogs.com/starspace/archive/2009/05/15/1458044.html
配置Vim: http://haohetao.javaeye.com/blog/690715
總結: 安裝vim --> 配置 /etc/vim/vimrc 檔案
使得vim能夠支援文法高亮、自動縮排等等功能。木目前使用的 vimrc 設定檔的內容如下,進行基本的 c/c++ 編程已經足夠了。
++++++++++++++++++++++++++++++++++
"文法高亮顯示
syntax enable
syntax on
set background=dark
set nocompatible
set number
"檢測檔案的類型
filetype on
"記錄曆史的行數
set history=1000
set cursorline
"set autoindent
set cindent
"設定C/C++語言的具體縮排方式
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
set smartindent
set expandtab " 使用空格代替tab.
set ts=4 "空格數量
set shiftwidth=4 "自動縮排的寬度
set showmatch
set cursorline
set nobackup
" just for encode
set fileencodings=utf-8,gb2312,gbk,gb18030
set termencoding=utf-8
set fileformats=unix
set encoding=prc
set hlsearch "高亮顯示所有匹配
" set foldmethod
set fdm=indent "程式碼摺疊功能
if &term=="xterm"
set t_Co=8
set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif
+++++++++++++++++++++++++++++++++++++++
vim的功能相當強大,各人可以根據自己的需求DIY這個vimrc檔案,完全可以製造出非同尋常的效果來,可以參見如下內容:
http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx
(一)代碼編寫
1。啟動終端;
2。輸入vim test.cpp,建立了一個檔案叫做“test.cpp”;如果以前已經建立過這個檔案,則是開啟這個名字的檔案。
3。預設進入的是命令模式,輸入 i、a、o等進入編輯插入模式,分別對應於當前位置之前、之後插入和插入一行。
如果要刪除當前正在編輯的那一行的內容(刪除一個字元,刪除一個字,刪除一行),則必須按下esc鍵回到命令模式,分別使用x(刪除一個字元)、dw(刪除一個字)、dd(刪除一行)來進行刪除。
如果要撤銷某此操作,回到命令模式,然後輸入命令u(undo)來撤銷操作;如果要恢複撤銷的內容,則在命令模式下,輸入命令":redo"或者是":Control鍵+r",在沒有設定compatible的情況下,可以作多次的撤銷和恢複;
4。編輯結束,輸入":w"表明存檔,然後輸入“:q”退出vim編輯器;也可以直接輸入“:wq”直接完成這兩個步驟。
(二)代碼編譯運行
設“test.cpp”檔案的內容是:
#include <iostream>
int main(int argc,char *argv[])
{
std::cout << "hello, world/n";
return 0;
}
1。
對於這個.cpp檔案,使用以下的命令進行檔案的編譯:
gcc -Wall test.cpp -o test -lstdc++ (必須加上 -lstdc++ 選項用來通知連結器連結靜態庫 libstdc++.a,否則會因為找不到庫函數而出錯)
或者直接使用編譯c++(.cpp)檔案專用的命令g++,如下:
g++ -Wall test.cpp -o test
==============
該命令將檔案‘test.cpp’中的代碼編譯為機器碼並儲存在可執行檔 ‘test’中。機器碼的檔案名稱是通過 -o 選項指定的,該選項通常作為命令列中的最後一個參數。如果被省略,輸出檔案預設為 ‘a.out’。
注意到如果目前的目錄中與可執行檔重名的檔案已經存在,則它將被複蓋。
選項 -Wall 開啟編譯器幾乎所有常用的警告──強烈建議你始終使用該選項。編譯器有很多其他的警告選項,但 -Wall 是最常用的。預設情況下GCC/G++不會產生任何警告資訊。當編寫 C 或 C++ 程式時編譯器警告非常有助於檢測程式存在的問題。
本例中,編譯器使用了 -Wall 選項而沒產生任何警告,因為樣本程式是完全合法的。
另外:如果一開始建立了一個“test.c”的c語言類型的檔案,內容如下;
#include <stdio.h>
int main(void)
{
printf("Hello, world!/n");
return 0;
}
編譯時間使用“gcc -Wall test.c -o testc”命令。另外必須注意的是,在c檔案中不能出現c++的庫,比如#include <iostream.h>就會報錯,但是cpp檔案包含c語言的庫卻是可以的。
==============
2.
運行:
$ ./test
==============
這個命令將可執行檔載入記憶體,並使 CPU 開始執行其包含的指令。 路徑“./”指代目前的目錄,因此“./test” 載入並執行目前的目錄下的可執行檔 ‘test’。
==============
運行結果為:hello, world
(三)編譯多個源檔案
1.
多源檔案檔案樣本
將上面的"test.cpp"分解為三個不同的檔案‘main.cpp’、‘test_fn.cpp’和標頭檔‘test.h’。
(1)主程式‘main.cpp’如下:
#include "test.h"
int main()
{
test("hello world!");
return 0;
}
(2)函式宣告檔案"test.h"如下內容:
void test(const char* name);
(3)函數實現檔案"test_fn.cpp"的內容如下:
#include <iostream>
using namespace std;
#include "test.h"
void test(const char* name)
{
cout<<"Hello World!"<<endl;
}
2.
多檔案編譯
g++ -Wall main.cpp test_fn.cpp -o newTest
=====================
本例中,我們使用選項 -o 為可執行檔指定了一個不同的名字 newTest。注意到標頭檔‘test.h’並未在命令列中指定,這是因為它已經在main.cpp中包含。
=====================
(四)簡單的makeFile檔案
make命令 從 makefile(預設是目前的目錄下的名為‘makefile’的檔案)中讀取項目的描述。makefile指定了一系列目標(比如可執行檔)和依賴(比如對象檔案和源檔案)的編譯規則,其格式如下:
目標: 依賴
命令
對每一個目標,make 檢查其對應的依賴檔案修改時間來確定該目標是否需要利用對應的命令重建立立。注意到,makefile 中命令列必須以單個的 TAB 字元進行縮排,不能是空格(糾正:就是空格而不是TAB)。
GNU Make 包含許多預設的規則(參見隱含規則)來簡化 makefile 的構建。比如說,它們指定‘.o’檔案可以通過編譯‘.c’檔案得到,可執行檔可以通過將‘.o’連結到一起獲得。隱含規則通過被叫做make變數的東西所指定,比如 CC(C 語言編譯器)和 CFLAGS(C程式的編譯選項);在makefile檔案中它們通過獨佔一行的 變數=值 的形式被設定。對 C++ ,其等價的變數是CXX和CXXFLAGS,而變數CPPFLAGS則是編譯預先處理選項。
1. 現在為上面的“編譯多個源檔案”樣本建立一個簡單的makefile檔案,內容如下:
CXXC=g++
CXXFLAGS=-Wall
newTest: main.o test_fn.o (使用了隱含規則 cpp-->o)
clean: rm -f newTest main.o test_fn.o
===================
該makefile檔案可以這樣來讀:使用 C++語言編譯器 g++,和編譯選項‘-Wall’,從對象檔案‘test.o’和‘test_fn.o’產生目標可執行檔 newTest(檔案‘test.o’和‘test_fn.o’通過隱含規則分別由‘test.c’和‘test_fn.c’產生)。目標clean沒有依賴檔案,它只是簡單地移除所有編譯產生的檔案。rm命令的選項 ‘-f’(force) 抑制檔案不存在時產生的錯誤訊息。
===================
2. 要使用該 makefile 檔案,輸入 make命令。不加參數調用make時,makefile檔案中的第一個目標被建立,從而產生可執行檔‘newTest’,終端會有如下輸出:
$ make
g++ -Wall -c -o main.o main.cpp
g++ -Wall -c -o test_fn.o test_fn.cpp
g++ main.o test_fn.o -o newTest
運行該可執行檔:
$ ./newTest
Hello, world!
3. 一個源檔案被修改要重建可執行檔,簡單地再次輸入 make 即可。通過檢查目標檔案和依賴檔案的時間戳記,程式 make 可識別哪些檔案已經修改並依據對應的規則更新其對應的目標檔案:
$ vim test.cpp (若開啟編輯器修改一下test.cpp檔案)
$ make (重新make)
g++ -Wall -c -o test.o test.c (此時只make該被修改的檔案test.cpp)
g++ test.o test_fn.o -o newTest
運行:
$ ./newTest
Hello, world!
4. 最後,移除 make 產生的檔案,輸入“make clean”,顯示如下:
$ make clean
rm -f hello hello.o hello_fn.o
總結: makefile檔案類似一個編譯串連程式的批次檔,所有的命令要作的事情寫進一個叫做makefile的檔案中,然後使用make命令可以執行這個類似批次檔的檔案makefile。一個專業的 makefile檔案通常包含用於安裝(make install)和測試(make check)等額外的目標。
本例子中涉及到的例子都足夠簡單以至於可以完全不需要makefile,但是對任何大些的程式都使用 makefile檔案是很有必要的。
(五)連結外部庫
庫是先行編譯的目標檔案(object files)的集合,它們可被連結進程式。靜態庫以尾碼為‘.a’的特殊的封存檔案(archive file)儲存。
標準系統庫可在目錄 /usr/lib 與 /lib 中找到。比如,在類 Unix 系統中 C 語言的數學庫一般儲存為檔案 /usr/lib/libm.a。該庫中函數的原型聲明在標頭檔 /usr/include/math.h 中。C 標準庫本身儲存為 /usr/lib/libc.a,它包含 ANSI/ISO C 標準指定的函數,比如‘printf’。對每一個 C 程式來說,libc.a 都預設被連結。
下面的是一個調用數學庫 libm.a 中 sin 函數的的例子,建立檔案calc.c:
#include <math.h>
#include <stdio.h>
int
main (void)
{
double x = sin (2.0);
printf ("The value of sin(2.0) is %f/n", x);
return 0;
}
嘗試單獨從該檔案產生一個可執行檔將導致一個連結階段的錯誤:
$ gcc -Wall calc.c -o calc
/tmp/ccbR6Ojm.o: In function 'main':
/tmp/ccbR6Ojm.o(.text+0x19): undefined reference to ‘sin’
函數 sin,未在本程式中定義也不在預設庫‘libc.a’中;除非被指定,編譯器也不會連結‘libm.a’。
1. 法一
為使編譯器能將 sin 連結進主程式‘calc.c’,我們需要提供數學庫‘libm.a’。一個容易想到但比較麻煩的做法是在命令列中顯式地指定它:
$ gcc -Wall calc.c /usr/lib/libm.a -o calc
函數庫‘libm.a’包含所有數學函數的目標檔案,比如sin,cos,exp,log及sqrt。連結器將搜尋所有檔案來找到包含 sin 的目標檔案。一旦包含 sin 的目標檔案被找到,主程式就能被連結,一個完整的可執行檔就可產生了:
$ ./calc
The value of sin(2.0) is 0.909297
可執行檔包含主程式的機器碼以及函數庫‘libm.a’中 sin 對應的機器碼。
2. 法二
為避免在命令列中指定長長的路徑,編譯器為連結函數庫提供了快捷的選項‘-l’。例如,下面的命令
$ gcc -Wall calc.c -lm -o calc
與我們上面指定庫全路徑‘/usr/lib/libm.a’的命令等價。
一般來說,選項 -lNAME使連結器嘗試連結系統庫目錄中的函數庫檔案 libNAME.a。一個大型的程式通常要使用很多 -l 選項來指定要連結的數學庫,圖形庫,網路程式庫等。