標籤:
1.GCC使用
在使用GCC編譯器時,編譯過程可以被細分為四個階段:
預先處理(Pre-Processing)
編譯(Compiling)彙編(Assembling)
連結(Linking)。
例如:
#include
int main(void)
{
printf ("Hello world, Linux programming!\n");
return 0;
}
然後執行下面的命令編譯和運行這段程式:
# gcc hello.c -o hello
#
./hello
Hello world, Linux programming!
GCC需要調用預先處理程式cpp,由它負責展開在源檔案中定義的宏,並向其中插入“#include”語句所包含的內容;接著,GCC會調用ccl和as將處理後的原始碼編譯成目標代碼;最後,GCC會調用連結程式ld,把產生的目標代碼連結成一個可執行程式。
第一步是進行先行編譯,使用-E參數可以讓GCC在預先處理結束後停止編譯過程:
# gcc -E hello.c -o
hello.i
此時若查看hello.cpp檔案中的內容,會發現stdio.h的內容確實都插到檔案裡去了,而其它應當被預先處理的宏定義也都做了相應的處理。下一步是將hello.i編譯為目標代碼,這可以通過使用-c參數來完成:
# gcc -c hello.i -o
hello.o
GCC預設將.i檔案看成是預先處理後的C語言原始碼,因此上述命令將自動跳過預先處理步驟而開始執行編譯過程,也可以使用-x參數讓GCC從指定的步驟開始編譯。最後一步是將產生的目標檔案連結成可執行檔:
# gcc hello.o -o hello
2.gcc和g++都是GNU(一個組織)的編譯器。
1、對於.c尾碼的檔案,gcc把它當做是C程式;g++當做是C++程式;
2、對於.cpp尾碼的檔案,gcc和g++都會當做c++程式。
3、編譯階段,g++會調用gcc(也就是說);
4、串連階段,通常會用g++來完成,這是因為gcc命令不能自動和c++程式使用的庫串連。
gcc可以用來編譯c++但是它不會自動調用連結的c++庫,你需要自己手動連結,使用如下命令: gcc -lstdc++main.cpp。g++則會自動調用連結的c++庫。
gcc可以根據尾碼名為.c或.cpp分別按c程式和c++程式來編譯;但是g++無論是.c或.cpp都統一按c++程式來編譯。
而且g++在編譯的過程中,其實是調用gcc按照c++程式來編譯的。即編譯工作最終都是由gcc來完成的。
對於c++程式,因為gcc命令不能自動和C++程式使用的庫聯結,需要自己手動連結c++庫,所以連結可以用g++或者gcc -lstdc++。也即是說c++程式,也可以用gcc來連結。
但是gcc在編譯c程式的時候,它會自動連結c庫的。
誤區一:gcc只能編譯c代碼,g++只能編譯c++代碼
兩者都可以,但是請注意:
1.尾碼為.c的,gcc把它當作是C程式,而g++當作是c++程式;尾碼為.cpp的,兩者都會認為是c++程式,注意,雖然c++是c的超集,但是兩者對文法的要求是有區別的。C++的文法規則更加嚴謹一些。
2.編譯階段,g++會調用gcc。對於c++代碼,可以用gcc或g++來編譯,二者等價的。
3 連結階段,因為gcc命令不能自動和C++程式使用的庫聯結,所以通常用g++來完成連結。一般為了方便,乾脆編譯和連結都用g++了。這就給人一種錯覺,好像cpp程式只能用g++編譯連結似的。
誤區二:gcc不會定義__cplusplus宏,而g++會
實際上,這個宏只是標誌著編譯器將會把代碼按C還是C++文法來解釋,如上所述,如果尾碼為.c,並且採用gcc編譯器,則該宏就是未定義的,否則,就是已定義。
誤區三:編譯只能用gcc,連結只能用g++
嚴格來說,這句話不算錯誤,但是它混淆了概念,應該這樣說:編譯可以用gcc/g++,而連結可以用g++或者gcc -lstdc++。因為gcc命令不能自動和C++程式使用的庫聯結,所以通常使用g++來完成聯結。但在編譯階段,g++會自動調用gcc,二者等價。
3.GCC升級問題
關於 GCC 在 CentOS 下通過 yum 安裝預設版本號碼,CentOS 5 是 4.1.2;CentOS 6 是 4.4.7;CentOS 7 是 4.8.3。
很多時候在編譯安裝軟體都需要高版本的 GCC,否則就會報錯。
那麼如何升級 GCC 的版本呢?
首先要確認升級到的 GCC 版本號碼。
目前 GCC 的最新版已經到了 5.2,而 CentOS 7 則依然使用其 4.8,所以基於相容性考慮,我選擇升級到 4.8.5。
GCC 官網:https://gcc.gnu.org
下面開始一步一步來編譯安裝 GCC 4.8.5,需要注意的是,在編譯安裝 GCC 之前,系統裡必須先要通過 yum 安裝老版本的 GCC 和依賴庫。
如果是在 x86_64 系統下編譯的話,還需要安裝 libgcc.i686 glibc-devel.i686 才行。
yum install -y gcc texinfo-tex flex zip libgcc.i686 glibc-devel.i686
當然,如果是在 CentOS 5 x86_64 系統下安裝,則是如下命令:
yum install -y gcc texinfo-tex flex zip libgcc.i386 glibc-devel.i386
同時需注意,編譯安裝 GCC 記憶體不小於 1GB,Swap 不小於 1GB,硬碟最低不小於 10GB,否則極有可能會中途報錯退出。
編譯安裝完後,目錄 gcc-4.8.5 將會有 5GB 之多。
1、下載源碼
wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz
2、下載依賴包
編譯安裝 GCC 需要依賴 mpc,mpfr,gmp包。好在 GCC 源碼裡內建指令碼可以輕鬆下載依賴包。
tar zxf gcc-4.8.5.tar.gzcd gcc-4.8.5./contrib/download_prerequisites
在此指令碼裡可以看到依賴包的版本號碼依次是 mpc-0.8.1,mpfr-2.4.2,gmp-4.3.2。
3、編譯安裝
mkdir gcc-build-4.8.5cd gcc-build-4.8.5../configure --prefix=/usrmake && make install
為了避免安裝後系統裡出現多個版本的 GCC,這裡直接將編譯安裝的目錄指定為 /usr,如果不指定 –prefix,則會預設安裝到 /usr/local 下。
GCC 4.8.5 光是原始碼就有105MB,因此可以預見整個編譯過程需要很長時間(差不多 2 個小時左右)。
4、查看版本號碼
gcc --versiongcc (GCC) 4.8.5g++ --versiong++ (GCC) 4.8.5which gcc/usr/bin/gccwhich g++/usr/bin/g++
註:本次是在 CentOS 6.7 x86_64 下安裝成功。
4。CentOS查看檔案的幾種方式
有許多命令都可以查看檔案,不同的命令有不同的優點,可以針對不同的需要分別選擇命令以提高效率:
cat 由第一行開始顯示內容,並將所有內容輸出
tac 從最後一行倒序顯示內容,並將所有內容輸出
more 根據視窗大小,一頁一頁的現實檔案內容
less 和more類似,但其優點可以往前翻頁,而且進行可以搜尋字元
head 只顯示頭幾行
tail 只顯示最後幾行
nl 類似於cat -n,顯示時輸出行號
我使用最多的是more和less!
1.cat 與 tac
cat的功能是將檔案從第一行開始連續的將內容輸出在螢幕上。但是cat並不常用,原因是當檔案大,行數比較多時,螢幕無法全部容下時,只能看到一部分內容。
cat文法:cat [-n] 檔案名稱
參數說明:-n : 顯示時,連行號一起輸出
tac文法:tac 檔案名稱
2.more和less(推薦使用)
相對於cat和tac來說,more和less很好用。
more的功能是將檔案從第一行開始,根據輸出視窗的大小,適當的輸出檔案內容。
當一頁無法全部輸出時,可以用“斷行符號鍵”向下翻3行(我的環境是3行,其他linux版本可能不同),或者使用“空格鍵”向下翻頁。
退出查看頁面,請按“q”鍵。
另外,more還可以配合管道符“|”(pipe)使用,例如:ls -al | more
3.head和tail
head和tail通常使用在只需要讀取檔案的前幾行或者後幾行的情況下使用。
head的功能是顯示檔案的前幾行內容
head的文法:
head 【-n number】 檔案名稱
4.nl
nl的功能和cat -n一樣,同樣是從第一行輸出全部內容,並且把行號顯示出來
nl的文法:
nl 檔案名稱
centos編譯helloworld的幾個小問題