• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            吾嘗終日而思矣 不如須臾之所學(xué)也

            御物而行 御風(fēng)而飛
            隨筆 - 10, 文章 - 1, 評論 - 9, 引用 - 0
            數(shù)據(jù)加載中……

            C++編譯器 GCC G++ 使用

            什么是gcc、什么是g++?

            gccg++都是GNU(組織)的一個(gè)編譯器。

            但兩者有一些區(qū)別:后綴為.c的文件gcc把它當(dāng)做c程序,g++當(dāng)做c++程序。后綴為c++的兩者都當(dāng)做c++程序。對于cpp程序,無論gcc或者是g++編譯階段都是相同的,都是用的gcc進(jìn)行編譯,但是在鏈接階段gcc不能自動c++程序使用的庫連接,如果使用的話,形如下: gcc helloworld.cpp -lstdc++ -o helloworld

            所以我們通常用g++來進(jìn)行連接(g++會自動連接c++常用庫),所以為了使用方便對于cpp程序干脆編譯鏈接統(tǒng)統(tǒng)都使用g++,這樣就給人一種錯(cuò)覺,好像cpp只能用g++編譯。

             

            Gcc編譯處理過程是什么呢?

            下面以helloworld程序?yàn)槔ミM(jìn)行解釋過程:

            其中hello.c的內(nèi)容如下:

            #include<stdio.h> 

            int main()

            {

                    printf("hello world\n");

            }

            第一步:預(yù)處理

                   預(yù)處理階段過程如下,預(yù)處理階段是進(jìn)行處理代碼中的宏和include指令,并作語法檢查。這一過程的命令為:#  gcc -E hello.c -o hello.i 執(zhí)行這一部生成了一個(gè)hello.i文件,如下:


            可以看到由于進(jìn)行了預(yù)處理,將include內(nèi)部的文件進(jìn)行了替換,預(yù)處理后的結(jié)果文件顯得特別大,所以在以后的程序中,沒有用到的頭文件最好不要引入,這樣會降低處理時(shí)間和空間。

            第二步:匯編程序生成匯編碼

            這一步是將預(yù)處理文件進(jìn)行匯編,生成匯編程序,命令如下:

            可以看出生成的匯編程序?yàn)?/span>59行。

            第三步:由匯編程序轉(zhuǎn)換為中間目標(biāo)文件

            這一步是將匯編的代碼進(jìn)一步進(jìn)行處理,每一個(gè)源程序都會生成相應(yīng)的目標(biāo)文件,是以.o為擴(kuò)展名的文件。命令如下:

             

            第四步:連接目標(biāo)文件,生成可執(zhí)行程序

            這一階段被稱為鏈接階段,這一階段完成的是將目標(biāo)文件進(jìn)行連接生成相應(yīng)的最終目標(biāo)文件(可執(zhí)行文件或靜態(tài)庫或動態(tài)庫)


            好了,這樣例子中的可執(zhí)行文件就生成了hello,運(yùn)行一下為:

            如何使用g++編譯動態(tài)庫\靜態(tài)庫?如何使用g++連接非標(biāo)準(zhǔn)庫和應(yīng)用程序?

            什么是庫呢?簡單的說庫就是一組已經(jīng)寫好了的函數(shù)和變量、是經(jīng)過編譯了的代碼,為了提高開發(fā)的效率和運(yùn)行的效率而設(shè)計(jì)的。庫可以分為靜態(tài)庫和動態(tài)庫(共享庫)兩類,在linux系統(tǒng)中靜態(tài)庫的擴(kuò)展名為.a,動態(tài)庫的擴(kuò)展名是.so。

            靜態(tài)庫是在每個(gè)程序進(jìn)行鏈接的時(shí)候?qū)煸谀繕?biāo)程序中進(jìn)行一次拷貝,當(dāng)目標(biāo)程序生成的時(shí)候,程序可以脫離庫文件單獨(dú)運(yùn)行,換言之原來的文件即使刪除程序還是會正常工作。

            共享庫可以被多個(gè)應(yīng)用程序共享,實(shí)在程序運(yùn)行的時(shí)候進(jìn)行動態(tài)的加載,因此對于每個(gè)應(yīng)用程序來說,即使不再使用某個(gè)共享庫,也不應(yīng)該將其刪除,因?yàn)槠渌囊贸绦蚩赡苄枰@個(gè)庫。

            1.       如何生成庫

            下面演示如何生成靜態(tài)庫和動態(tài)庫:

            生成靜態(tài)庫的過程是先將每個(gè)每個(gè)原文件進(jìn)行編譯生成中間目標(biāo)文件,然后利用打包程序,將程序進(jìn)行一次打包,最后生成靜態(tài)庫文件。以下面的例子說明問題:

            目錄結(jié)構(gòu)為


            包括3個(gè)文件,其中hello.c是用來生成靜態(tài)庫的源文件,hello.h是其頭文件,test.c是其測試程序,用來測試庫生成是否正確,在這個(gè)例子中我們會將hello.c生成libhello.a,然后用test.cpp進(jìn)行連接,最后生成hello的可執(zhí)行文件。

            首先生成庫文件,

            然后通過鏈接靜態(tài)庫文件,將test.clibhello.a生成相應(yīng)的應(yīng)用程序testhello

            在這個(gè)例子中,我們刪除靜態(tài)庫后,程序依然正常運(yùn)行。

            下面通過生成動態(tài)庫連接成為應(yīng)用程序,生成動態(tài)庫的命令是

            gcc -shared -fPIC  hello.c -o libhello.so這樣就生成了動態(tài)庫


            在把so所在的路徑在環(huán)境變量里添加上,注意應(yīng)該添加到LD_LIBRARY_PATH中,另外還要運(yùn)行命令ldconfig,此命令在/sbin/目錄下。這樣就能正常運(yùn)行了。下面是測試:

            如果刪除之后,在運(yùn)行就會:

             

            從上面可知,如果在小的項(xiàng)目中使用gcc還是比較方便的,如果再大的工程中,我們必須記住gcc命令,如果想讓程序做移植的話,必須還得充足的文檔才能管理大項(xiàng)目。下面提供一種解決方法,通過makefile來解決這些問題,當(dāng)你移植你的程序時(shí)只需要做簡單的操作,就能成功生成相應(yīng)的二進(jìn)制文件,從而簡化了大項(xiàng)目的管理等問題。

             

            GCC編譯器的選項(xiàng)解讀

            1. 基本選項(xiàng)

            -E是只進(jìn)行預(yù)處理選項(xiàng),不進(jìn)行編譯、匯編、以及連接

            -S 編譯后停止,不進(jìn)行會變和連接

            -c編譯或會匯編文件,但不進(jìn)行連接

            -o file 指定輸出文件名

            2. 警告選項(xiàng)

            -Wall 啟用所有警告信息

            -Werror 在發(fā)生警告時(shí)取消編譯操作,即將警報(bào)看作是錯(cuò)誤

            -w 禁用所有警告信息

            3. 優(yōu)化選項(xiàng)

            -O0:不進(jìn)行優(yōu)化處理

            -O或-O1:進(jìn)行基本的優(yōu)化,這些優(yōu)化在大所屬情況下都會使程序執(zhí)行的更快

            -O2:除了完成-O1級別的優(yōu)化外,還需要一些其他的調(diào)整工作,如處理器指令調(diào)度等,只是GNU發(fā)布軟件的默認(rèn)優(yōu)化

            -O3:除了完成-O2級別的優(yōu)化外,還進(jìn)行循環(huán)的展開(這往往會提高執(zhí)行速度)以及其他的一些預(yù)處理器相關(guān)的優(yōu)化工作。

            -Os:生成最小的可執(zhí)行文件,主要用在嵌入式領(lǐng)域。

            4. 連接器選項(xiàng)

            -Idirectory 向GCC的頭文件搜索路徑中添加新的目錄

            -Ldirectory 向GCC的庫文件搜索路徑中添加一個(gè)行的目錄

            -llibrary 提示連接程序在創(chuàng)建可執(zhí)行文件時(shí)包含指定的庫文件

            -static 強(qiáng)制使用靜態(tài)庫

            -shared 強(qiáng)制使用共享庫

            5. 其他選項(xiàng)

            -xlanguage 指定輸入文件的編程語言

            -v 顯示編譯器的版本號

            -g 獲得有關(guān)調(diào)試程序的詳細(xì)信息

            -ansi 支持符合ansi彼岸準(zhǔn)的c程序

             

             

            既然已經(jīng)講了這么多了索性再講講gcc使用的一些環(huán)境變量

            除了大名鼎鼎的CFLAGS和CXXFLAGS以外(其實(shí)是Autoconf的環(huán)境變量),再挑幾個(gè)說說:

            所有的PATH類環(huán)境變量(除LD_RUN_PATH外)都是用冒號分割的目錄列表。

             

            C_INCLUDE_PATH 編譯C程序時(shí)使用的環(huán)境變量,用于查找頭文件。

             

            CPLUS_INCLUDE_PATH 編譯C++程序時(shí)使用的環(huán)境變量,用于查找頭文件。

             

            OBJC_INCLUDE_PATH 編譯Obj-C程序時(shí)使用的環(huán)境變量,用于查找頭文件。

             

            CPATH 編譯C/C++/Obj-C程序時(shí)使用的環(huán)境變量,用于查找頭文件。

             

            COMPILER_PATH 如果沒有用GCC_EXEC_PREFIX定位子程序,編譯程序?qū)诖瞬檎宜淖映绦颉?/span>

             

            LIBRARY_PATH 連接程序?qū)⒃谶@些目錄中尋找特殊的連接程序文件。

             

            LD_LIBRARY_PATH 該環(huán)境變量不影響編譯程序,但是程序運(yùn)行的時(shí)候會有影響:程序會查找該目錄列表以尋找共享庫。

            當(dāng)不能夠在編譯程序的目錄中找到共享庫的時(shí)候,執(zhí)行程序必須設(shè)置該環(huán)境變量。

             

            LD_RUN_PATH 該環(huán)境變量不影響編譯程序,但是程序運(yùn)行的時(shí)候會有影響:它在運(yùn)行時(shí)指出了文件的名字,運(yùn)行的程序可以由此得到它的符號名字和地址。

            由于地址不會重新載入,因而可能符號應(yīng)用其他文件中的絕對地址。這個(gè)和ld工具使用的"-R"選項(xiàng)完全一樣。

             

            GCC_EXEC_PREFIX 編譯程序執(zhí)行所有子程序的名字的前綴,默認(rèn)值是"<prefix>/lib/gcc-lib/",

            其中的<prefix>是安裝時(shí)configure腳本指定的前綴。

             

            LANG 指定編譯程序使用的字符集,可用于創(chuàng)建寬字符文件、串文字、注釋;默認(rèn)為英文。[目前只支持日文"C-JIS,C-SJIS,C-EUCJP",不支持中文]

             

            LC_ALL 指定多字節(jié)字符的字符分類,主要用于確定字符串的字符邊界以及編譯程序使用何種語言發(fā)出診斷消息;默認(rèn)設(shè)置與LANG相同。

            中文相關(guān)的幾項(xiàng):"zh_CN.GB2312 , zh_CN.GB18030 , zh_CN.GBK , zh_CN.UTF-8 , zh_TW.BIG5"

             

            TMPDIR 編譯程序存放臨時(shí)工作文件的臨時(shí)目錄,這些臨時(shí)文件通常在編譯結(jié)束時(shí)被刪除。

            posted on 2011-11-13 15:01 Roger 閱讀(11454) 評論(1)  編輯 收藏 引用

            評論

            # re: C++編譯器 GCC G++ 使用  回復(fù)  更多評論   

            Nice work!
            2011-11-14 19:00 | tangb4c
            欧美日韩精品久久免费| 久久伊人精品一区二区三区| 99久久国产宗和精品1上映| 日韩精品久久无码中文字幕| 99久久精品免费观看国产| 色偷偷偷久久伊人大杳蕉| 国产午夜精品理论片久久影视| 久久久久亚洲av成人网人人软件| 99久久国产亚洲高清观看2024| 日韩精品无码久久久久久| 亚洲成色WWW久久网站| 久久男人中文字幕资源站| 国产精品久久久久无码av| 精品综合久久久久久98| 青青草原综合久久| 国产精品久久久久久久午夜片 | 狠狠色综合网站久久久久久久高清| 亚洲av成人无码久久精品| 精品99久久aaa一级毛片| 精品久久久久久无码中文野结衣| 久久午夜夜伦鲁鲁片免费无码影视| 国内精品久久久久| 久久久女人与动物群交毛片| 久久久久亚洲AV片无码下载蜜桃| 久久久久香蕉视频| 亚洲AV伊人久久青青草原| 色妞色综合久久夜夜| 久久亚洲2019中文字幕| 久久免费99精品国产自在现线 | 久久国产视频99电影| 日本一区精品久久久久影院| 91精品国产乱码久久久久久 | 久久AAAA片一区二区| 久久香蕉一级毛片| 一级做a爰片久久毛片16| 国内精品久久久久久久亚洲| 久久91精品综合国产首页| 久久97久久97精品免视看| 久久最新免费视频| 精产国品久久一二三产区区别| 久久久久国产精品嫩草影院|