centos編譯helloworld的幾個小問題

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 hellolinux

2.gcc和g++都是GNU(一個組織)的編譯器。c++

一、對於.c後綴的文件,gcc把它當作是C程序;g++當作是C++程序;less

二、對於.cpp後綴的文件,gcc和g++都會當作c++程序。flex

三、編譯階段,g++會調用gcc(也就是說);ui

四、鏈接階段,一般會用g++來完成,這是由於gcc命令不能自動和c++程序使用的庫鏈接。spa

 gcc能夠用來編譯c++可是它不會自動調用連接的c++庫,你須要本身手動連接,使用以下命令: gcc -lstdc++main.cpp。g++則會自動調用連接的c++庫。blog

gcc能夠根據後綴名爲.c或.cpp分別按c程序和c++程序來編譯;可是g++不管是.c或.cpp都統一按c++程序來編譯。
並且g++在編譯的過程當中,實際上是調用gcc按照c++程序來編譯的。即編譯工做最終都是由gcc來完成的。
對於c++程序,由於gcc命令不能自動和C++程序使用的庫聯接,須要本身手動連接c++庫,因此連接能夠用g++或者gcc -lstdc++。也便是說c++程序,也能夠用gcc來連接。ip

可是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++編譯連接似的。get


誤區二: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 之多。

一、下載源碼

wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz

二、下載依賴包
編譯安裝 GCC 須要依賴 mpc,mpfr,gmp包。好在 GCC 源碼裏自帶腳本能夠輕鬆下載依賴包。

tar zxf gcc-4.8.5.tar.gz
cd gcc-4.8.5
./contrib/download_prerequisites

在此腳本里能夠看到依賴包的版本號依次是 mpc-0.8.1,mpfr-2.4.2,gmp-4.3.2。

三、編譯安裝

mkdir gcc-build-4.8.5
cd gcc-build-4.8.5
../configure --prefix=/usr
make && make install

爲了不安裝後系統裏出現多個版本的 GCC,這裏直接將編譯安裝的目錄指定爲 /usr,若是不指定 –prefix,則會默認安裝到 /usr/local 下。
GCC 4.8.5 光是源代碼就有105MB,所以能夠預見整個編譯過程須要很長時間(差很少 2 個小時左右)。

四、查看版本號

gcc --version
gcc (GCC) 4.8.5

g++ --version
g++ (GCC) 4.8.5

which gcc
/usr/bin/gcc

which 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.nlnl的功能和cat -n同樣,一樣是從第一行輸出所有內容,而且把行號顯示出來nl的語法:nl 文件名

相關文章
相關標籤/搜索