青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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

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

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

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

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

但兩者有一些區(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++,這樣就給人一種錯覺,好像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í)行這一部生成了一個hello.i文件,如下:


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

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

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

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

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

這一步是將匯編的代碼進(jìn)一步進(jìn)行處理,每一個源程序都會生成相應(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è)計的。庫可以分為靜態(tài)庫和動態(tài)庫(共享庫)兩類,在linux系統(tǒng)中靜態(tài)庫的擴(kuò)展名為.a,動態(tài)庫的擴(kuò)展名是.so。

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

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

1.       如何生成庫

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

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

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


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

首先生成庫文件,

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

在這個例子中,我們刪除靜態(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)你移植你的程序時只需要做簡單的操作,就能成功生成相應(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ā)生警告時取消編譯操作,即將警報看作是錯誤

-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的庫文件搜索路徑中添加一個行的目錄

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

-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)境變量),再挑幾個說說:

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

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

 

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

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

 

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

其中的<prefix>是安裝時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 編譯程序存放臨時工作文件的臨時目錄,這些臨時文件通常在編譯結(jié)束時被刪除。

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

評論

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

Nice work!
2011-11-14 19:00 | tangb4c

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            最新国产精品拍自在线播放| 欧美亚洲一区二区在线观看| 亚洲国产清纯| 国产一区二区三区丝袜| 国产精品国产福利国产秒拍| 欧美人成在线视频| 欧美日本免费一区二区三区| 欧美性大战久久久久久久| 欧美日韩一区二区三区四区五区| 欧美日韩亚洲高清| 国产精品永久免费| 极品尤物av久久免费看| 亚洲精品乱码久久久久| 亚洲天堂网在线观看| 欧美在线电影| 午夜日韩在线| 中文一区二区在线观看| 久久精品成人欧美大片古装| 亚洲欧美日韩另类| 蜜臀久久99精品久久久画质超高清| 美女尤物久久精品| 亚洲美女电影在线| 亚洲字幕在线观看| 欧美成人精品在线播放| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 最新热久久免费视频| 亚洲小视频在线观看| 久久久久久国产精品一区| 美女爽到呻吟久久久久| 一区二区三区精品视频在线观看| 亚洲国产综合91精品麻豆| 亚洲美女精品久久| 久久久久综合| 亚洲自拍啪啪| 欧美日韩一区二区在线| 伊人久久av导航| 亚洲欧美日韩国产综合| 亚洲日本久久| 久久久噜噜噜久噜久久| 国产日韩欧美一区二区| 一区二区免费在线播放| 欧美成ee人免费视频| 亚洲夜晚福利在线观看| 欧美欧美天天天天操| 在线观看亚洲视频| 欧美一区二区在线看| 99这里只有久久精品视频| 久久综合九色综合网站| 在线观看免费视频综合| 久久成人av少妇免费| 中文一区二区| 欧美日韩精品综合| 亚洲美女尤物影院| 美女主播一区| 久久在线免费观看视频| 欲香欲色天天天综合和网| 久久精品三级| 欧美一区三区二区在线观看| 国产精品视频xxx| 国产日韩精品一区二区三区| 亚洲区国产区| 亚洲高清123| 欧美成人精品一区二区| 亚洲久色影视| 亚洲精品美女久久久久| 欧美日韩喷水| 亚洲欧美视频一区| 亚洲欧美影院| 国产私拍一区| 欧美在线视频在线播放完整版免费观看 | 亚洲欧美一区在线| 欧美成人午夜激情视频| 欧美1级日本1级| 99精品热视频| 夜夜爽av福利精品导航 | 国产午夜精品久久| 男女视频一区二区| 欧美另类一区| 欧美一进一出视频| 久久精品综合| 亚洲福利视频网站| 亚洲激情第一区| 国产精品理论片| 久久精品国产免费| 久久综合久久综合久久| 中文精品视频一区二区在线观看| 亚洲免费一在线| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲欧美日韩成人高清在线一区| 国产尤物精品| 亚洲欧洲精品一区二区| 欧美一区二区三区在线播放| 一区二区三区在线观看国产| 亚洲国产三级| 国产欧美三级| 亚洲国产精选| 国产无一区二区| 99精品国产在热久久下载| 国产日本欧美在线观看| 亚洲精品国产欧美| 国产美女精品人人做人人爽| 日韩一区二区免费高清| 欧美影院一区| 亚洲视频香蕉人妖| 久久综合中文| 亚洲三级电影全部在线观看高清| 亚洲欧美乱综合| 日韩天堂av| 欧美一二三区精品| 欧美激情网站在线观看| 久久在精品线影院精品国产| 欧美屁股在线| 欧美国产精品v| 国产午夜精品久久久| 亚洲欧美国产一区二区三区| 亚洲激情小视频| 亚洲第一在线综合网站| 国产一区二区0| 亚洲理论在线| 在线观看福利一区| 小黄鸭视频精品导航| 亚洲一区二区在| 久久麻豆一区二区| 久久激情综合网| 国产精品久久久久9999高清| 亚洲精品日本| 亚洲六月丁香色婷婷综合久久| 久久裸体艺术| 免费日韩av电影| 精品va天堂亚洲国产| 午夜在线电影亚洲一区| 国产免费观看久久| 午夜日韩福利| 欧美在线91| 国产日韩欧美一区二区| 亚洲一区二区三区午夜| 午夜一区二区三区在线观看| 欧美日韩大片| 亚洲日本国产| 一本综合精品| 欧美日韩成人综合在线一区二区| 亚洲国产中文字幕在线观看| 91久久精品一区二区别| 免费永久网站黄欧美| 欧美国产第二页| 亚洲国产精品久久久| 欧美一站二站| 蜜桃av噜噜一区| 久久国产欧美精品| 欧美视频一区二区在线观看 | 欧美亚洲网站| 欧美亚男人的天堂| 亚洲一区二区三区高清| 亚洲午夜性刺激影院| 欧美天堂亚洲电影院在线观看| av成人手机在线| 久久精品视频在线播放| 精品999网站| 欧美激情女人20p| 日韩午夜激情av| 亚洲欧美日韩久久精品| 国产一区二区日韩精品| 久久人91精品久久久久久不卡| 欧美激情视频网站| 亚洲一区二区成人在线观看| 国产欧美一区二区三区沐欲| 久久综合电影一区| 亚洲美女中文字幕| 久久久www免费人成黑人精品 | 久久精品国产精品亚洲综合| 欧美成人午夜| 亚洲免费视频一区二区| 国产一区二区三区在线观看精品 | 亚洲激情黄色| 欧美一区二区三区四区夜夜大片| 黄色日韩网站| 女主播福利一区| 亚洲香蕉在线观看| 亚洲第一在线综合在线| 欧美亚洲在线视频| 激情文学综合丁香| 国产精品久久久久一区二区三区| 久久精品视频亚洲| 9色国产精品| 欧美国产日本| 久久精品国产99精品国产亚洲性色 | 久久久久久久综合| av成人激情| 欧美激情中文字幕在线| 欧美亚洲一级| 亚洲综合三区| 日韩写真在线| 国产一区清纯| 欧美日韩一二三区| 狂野欧美激情性xxxx| 午夜视频久久久| 国产精品伦子伦免费视频| 欧美激情国产日韩| 久久久久久久综合狠狠综合| 亚洲女人小视频在线观看|