官术网_书友最值得收藏!

2.3 在Linux下開發C程序

知識點講解:光盤:視頻\PPT講解(知識點)\第2章\在Linux下開發C程序.mp4

在平常工作中,我們都熟識了Windows系統,程序開發也習慣了在Windows環境下開發程序這一工作模式。但是,在特殊應用領域,例如單片機應用和嵌入式開發,就需要在Linux環境下開發C程序。Linux是一種計算機操作系統,是一套免費使用和自由傳播的類UNIX操作系統,它主要用于基于Intel x86系列CPU的計算機上。這個系統是由世界各地成千上萬的程序員設計和實現的。其目的是建立不受任何商品化軟件的版權制約的、全世界都能自由使用的UNIX兼容產品。

當前C語言程序最為常見的應用是嵌入式開發或單片機開發,上述應用幾乎都需要基于Linux平臺。所以,Linux環境下進行C語言開發十分普及,為此,在本節內容中簡要介紹在Linux環境下進行C語言開發的基本知識。

2.3.1 裝備GCC

在安裝GCC之前,系統中必須要有CC或者GCC等編譯器,并且是可用的,或者用環境變量CC指定系統上的編譯器。如果系統上沒有編譯器,不能安裝源代碼形式的GCC。如果是這種情況,可以在網上找一個與你系統相適應的如RPM等二進制形式的GCC軟件包來安裝使用。本文介紹的是以源代碼形式提供的GCC軟件包的安裝過程,軟件包本身和其安裝過程同樣適用于其他Linux和UNIX系統。

系統上原來的GCC編譯器可能是把gcc等命令文件、庫文件、頭文件等分別存放到系統中的不同目錄下的。與此不同,現在我們將一個版本的GCC安裝在一個單獨的目錄下。這樣做的好處是,將來不需要它的時候可以方便地刪除整個目錄即可(因為GCC沒有uninstall功能);缺點是,在安裝完成后要做一些設置工作才能使編譯器工作正常。在本文中采用這個方案安裝GCC,并且在安裝完成后,仍然能夠使用原來低版本的GCC編譯器,即一個系統上可以同時存在并使用多個版本的GCC編譯器。

按照本文提供的步驟和設置選項,即使以前沒有安裝過GCC,也可以在系統上安裝一個可工作的新版本的GCC編譯器。下面以GCC 3.4.0版本為例,介紹具體的安裝過程。

1.下載

登錄GCC網站http://gcc.gnu.org/或者通過網上搜索查找到下載資源。可供下載的文件一般有兩種形式:.tar.gz和.tar.bz2,只是壓縮格式不一樣,內容完全一致,下載其中一種即可。

2.解壓縮

根據壓縮格式,選擇下面相應的一種方式解包(以下的“%”表示命令行提示符):

        % tar xzvf gcc-3.4.0.tar.gz

或者:

        % bzcat gcc-3.4.0.tar.bz2 | tar xvf -

新生成的gcc-3.4.0目錄稱為源目錄,用${srcdir}表示它。以后在出現${srcdir}的地方,應該用真實的路徑來替換它。用pwd命令可以查看當前路徑。

在${srcdir}/INSTALL目錄下有詳細的GCC安裝說明,可用瀏覽器打開index.html閱讀。

3.建立目標目錄

目標目錄(用${objdir}表示)是用來存放編譯結果的地方。GCC建議編譯后的文件不要放在源目錄${srcdir]中(雖然這樣做也可以),最好單獨存放在另外一個目錄中,而且不能是${srcdir}的子目錄。

例如,可以這樣建立一個叫gcc-build的目標目錄(與源目錄${srcdir}是同級目錄):

        % mkdir gcc-build
        % cd gcc-build

以下的操作主要是在目標目錄 ${objdir} 下進行。

4.配置

配置的目的是決定將GCC編譯器安裝到什么地方(${destdir}),支持什么語言以及指定其他一些選項等。其中,${destdir}不能與${objdir}或${srcdir}目錄相同。配置是通過執行${srcdir}下的configure來完成的。其命令格式為(記得用你的真實路徑替換${destdir}):

        % ${srcdir}/configure --prefix=${destdir} [其他選項]

例如,如果想將GCC 3.4.0安裝到/usr/local/gcc-3.4.0目錄下,則${destdir}就表示這個路徑。

在筆者的機器上是這樣配置的:

        % ../gcc-3.4.0/configure --prefix=/usr/local/gcc-3.4.0--enable-threads=posix --disable-checking --enable--long-long
    --host=i386-redhat-linux --with-system-zlib --enable-languages=c, c++, java

將GCC安裝在/usr/local/gcc-3.4.0目錄下,支持C/C++和Java語言,其他選項參見GCC提供的幫助說明。

5.編譯

使用% make命令。

6.安裝

執行下面的命令將編譯好的庫文件等復制到${destdir}目錄中(根據你設定的路徑,可能需要管理員的權限):

        % make install

至此,GCC 3.4.0安裝過程就完成了。

7.其他設置

GCC 3.4.0的所有文件,包括命令文件(如gcc、g++)、庫文件等都在${destdir}目錄下分別存放,如命令文件放在bin目錄下、庫文件在lib下、頭文件在include下等。由于命令文件和庫文件所在的目錄還沒有包含在相應的搜索路徑內,所以,必須要進行適當的設置之后編譯器才能順利地找到并使用它們。

? GCC、g++、gcj的設置

要想使用GCC 3.4.0的GCC等命令,簡單的方法就是把它的路徑${destdir}/bin放在環境變量PATH中。我不用這種方式,而是用符號連接的方式實現,這樣做的好處是,我仍然可以使用系統上原來的舊版本的GCC編譯器。

首先,查看原來的GCC所在的路徑:

        % which gcc

假設上述命令顯示:/usr/bin/gcc。因此,原來的GCC命令在/usr/bin目錄下。我們可以把GCC 3.4.0中的GCC、g++、gcj等命令在/usr/bin目錄下分別做一個符號連接:

        % cd /usr/bin
        % ln -s ${destdir}/bin/gcc gcc34
        % ln -s ${destdir}/bin/g++ g++34
        % ln -s ${destdir}/bin/gcj gcj34

這樣,就可以分別使用gcc34、g++34、gcj34來調用GCC 3.4.0的gcc、g++、gcj完成對C、C++、Java程序的編譯了。同時,仍然能夠使用舊版本的GCC編譯器中的gcc、g++等命令。

? 庫路徑的設置。

將${destdir}/lib路徑添加到環境變量LD_LIBRARY_PATH中,最好添加到系統的配置文件中,這樣就不必要每次都設置這個環境變量了。例如,如果GCC 3.4.0安裝在/usr/local/gcc-3.4.0目錄下,在RH Linux下可以直接在命令行上執行或者在文件/etc/profile中添加下面一句:

        setenv LD_LIBRARY_PATH /usr/local/gcc-3.4.0/lib:$LD_LIBRARY_PATH

8.測試

用新的編譯命令(gcc34、g++34等)編譯你以前的C、C++程序,檢驗新安裝的GCC編譯器是否能正常工作。

注意:根據需要,可以刪除或者保留${srcdir}和${objdir}目錄。

2.3.2 GCC基本使用介紹

Linux系統下的GCC(GNU C Compiler)是GNU推出的功能強大、性能優越的多平臺編譯器,是GNU的代表作品之一。GCC是可以在多種硬體平臺上編譯出可執行程序的超級編譯器,其執行效率與一般的編譯器相比平均效率要高20%~30%。

1.約定規則

GCC編譯器能將C、C++語言源程序、程式化程序和目標程序編譯并連接成可執行文件,如果沒有給出可執行文件的名字,GCC將生成一個名為a.out的文件。在Linux系統中,可執行文件沒有統一的后綴,系統從文件的屬性來區分可執行文件和不可執行文件。而GCC則通過后綴來區別輸入文件的類別,下面我們來介紹GCC所遵循的部分約定規則。

? .c為后綴的文件:C語言源代碼文件。

? .a為后綴的文件:是由目標文件構成的檔案庫文件。

? .C、.cc或.cxx為后綴的文件:是C++源代碼文件。

? .h為后綴的文件:是程序所包含的頭文件。

? .i為后綴的文件:是已經預處理過的C源代碼文件。

? .ii為后綴的文件:是已經預處理過的C++源代碼文件。

? .m為后綴的文件:是Objective-C源代碼文件。

? .o為后綴的文件:是編譯后的目標文件。

? .s為后綴的文件:是匯編語言源代碼文件。

? .S為后綴的文件:是經過預編譯的匯編語言源代碼文件。

2.GCC的執行過程

雖然我們稱GCC是C語言的編譯器,但使用GCC由C語言源代碼文件生成可執行文件的過程不僅僅是編譯的過程,而是要經歷4個相互關聯的步驟:預處理(也稱預編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和連接(Linking)。

命令GCC首先調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。接著調用cc1進行編譯,這個階段根據輸入文件生成以.o為后綴的目標文件。匯編過程是針對匯編語言的步驟,調用as進行工作,一般來講,.S為后綴的匯編語言源代碼文件和匯編、.s為后綴的匯編語言文件經過預編譯和匯編之后都生成以.o為后綴的目標文件。當所有的目標文件都生成之后,GCC就調用ld來完成最后的關鍵性工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的地方。

3.GCC的基本用法和選項

在使用GCC編譯器時,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數。

GCC最基本的用法如下:

          gcc [options] [filenames]

其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。其中[options]的值可以為如下所示的值。

? -c:只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為后綴的目標文件,通常用于編譯不包含主程序的子程序文件。

? -o output_filename:確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,GCC就給出預設的可執行文件a.out。

? -g:產生符號調試工具(GNU的gdb)所必要的符號信息,要想對源代碼進行調試,我們就必須加入這個選項。

? -O:對程序進行優化編譯、連接,采用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。

? -O2:比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。

? -Idirname:將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況:

A:#include;

B:#include“myinc.h”。

其中,A類使用尖括號(< >), B類使用雙引號(“ ”)。對于A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,而對于B類,cpp在當前目錄中搜尋頭文件,這個選項的作用是告訴cpp,如果在當前目錄中沒有找到需要的文件,就到指定的dirname目錄中去尋找。在程序設計中,如果我們需要的這種包含文件分別分布在不同的目錄中,就需要逐個使用-I選項給出搜索路徑。

? -Ldirname:將dirname所指出的目錄加入到程序函數檔案庫文件的目錄列表中,是在連接過程中使用的參數。在預設狀態下,連接程序ld在系統的預設路徑中(如/usr/lib)尋找所需要的檔案庫文件,這個選項告訴連接程序,首先到-L指定的目錄中去尋找,然后到系統預設路徑中尋找,如果函數庫存放在多個目錄下,就需要依次使用這個選項,給出相應的存放目錄。

? -lname:在連接時,裝載名字為“libname.a”的函數庫,該函數庫位于系統預設的目錄或者由-L選項確定的目錄下。例如,-lm表示連接名為“libm.a”的數學函數庫。

注意:因為本書的重點不是Linux,所以對此知識點到為止。

主站蜘蛛池模板: 正宁县| 广平县| 惠州市| 松原市| 衡阳县| 五原县| 鄂伦春自治旗| 青海省| 介休市| 江达县| 盐城市| 侯马市| 富川| 图片| 扎赉特旗| 莆田市| 遂川县| 屯门区| 灯塔市| 甘孜县| 九寨沟县| 大方县| 古交市| 荣昌县| 随州市| 马尔康县| 六枝特区| 喀什市| 屏南县| 汝城县| 繁峙县| 鄂温| 开封市| 灌南县| 镇平县| 北宁市| 甘南县| 洛扎县| 平原县| 布尔津县| 泰州市|