av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

linux下使用g++編譯cpp工程的方法

瀏覽:137日期:2024-04-16 13:22:10

C++編程中相關(guān)文件后綴

linux下使用g++編譯cpp工程的方法

1.單個(gè)源文件生成可執(zhí)行程序

下面是一個(gè)保存在文件 helloworld.cpp 中一個(gè)簡單的 C++ 程序的代碼:

/* helloworld.cpp */#include <iostream>int main(int argc,char *argv[]){ std::cout << 'hello, world' << std::endl; return(0);}

程序使用定義在頭文件 iostream 中的 cout,向標(biāo)準(zhǔn)輸出寫入一個(gè)簡單的字符串。該代碼可用以下命令編譯為可執(zhí)行文件:

$ g++ helloworld.cpp

編譯器 g++ 通過檢查命令行中指定的文件的后綴名可識(shí)別其為 C++ 源代碼文件。編譯器默認(rèn)的動(dòng)作:編譯源代碼文件生成對(duì)象文件(object file),鏈接對(duì)象文件和 libstdc++ 庫中的函數(shù)得到可執(zhí)行程序。然后刪除對(duì)象文件。由于命令行中未指定可執(zhí)行程序的文件名,編譯器采用默認(rèn)的 a.out。程序可以這樣來運(yùn)行:

$ ./a.outhello, world

更普遍的做法是通過 -o 選項(xiàng)指定可執(zhí)行程序的文件名。下面的命令將產(chǎn)生名為 helloworld 的可執(zhí)行文件:

$ g++ helloworld.cpp -o helloworld

在命令行中輸入程序名可使之運(yùn)行:

$ ./helloworld hello, world

程序 g++ 是將 gcc 默認(rèn)語言設(shè)為 C++ 的一個(gè)特殊的版本,鏈接時(shí)它自動(dòng)使用 C++ 標(biāo)準(zhǔn)庫而不用 C 標(biāo)準(zhǔn)庫。通過遵循源碼的命名規(guī)范并指定對(duì)應(yīng)庫的名字,用 gcc 來編譯鏈接 C++ 程序是可行的,如下例所示:

$ gcc helloworld.cpp -lstdc++ -o helloworld

選項(xiàng) -l (ell) 通過添加前綴 lib 和后綴 .a 將跟隨它的名字變換為庫的名字 libstdc++.a。而后它在標(biāo)準(zhǔn)庫路徑中查找該庫。gcc 的編譯過程和輸出文件與 g++ 是完全相同的。

在大多數(shù)系統(tǒng)中,GCC 安裝時(shí)會(huì)安裝一名為 c++ 的程序。如果被安裝,它和 g++ 是等同,如下例所示,用法也一致:

$ c++ helloworld.cpp -o helloworld

2.多個(gè)源文件生成可執(zhí)行程序

如果多于一個(gè)的源碼文件在 g++ 命令中指定,它們都將被編譯并被鏈接成一個(gè)單一的可執(zhí)行文件。下面是一個(gè)名為 speak.h 的頭文件;它包含一個(gè)僅含有一個(gè)函數(shù)的類的定義:

/* speak.h */#include <iostream>class Speak{ public: void sayHello(const char *);};

下面列出的是文件 speak.cpp 的內(nèi)容:包含 sayHello() 函數(shù)的函數(shù)體:

/* speak.cpp */ #include 'speak.h' void Speak::sayHello(const char *str) { std::cout << 'Hello ' << str << 'n'; }

文件 hellospeak.cpp 內(nèi)是一個(gè)使用 Speak 類的程序:

/* hellospeak.cpp */#include 'speak.h'int main(int argc,char *argv[]){ Speak speak; speak.sayHello('world'); return(0);}

下面這條命令將上述兩個(gè)源碼文件編譯鏈接成一個(gè)單一的可執(zhí)行程序:

$ g++ hellospeak.cpp speak.cpp -o hellospeak

PS:這里說一下為什么在命令中沒有提到“speak.h“該文件(原因是:在“speak.cpp“中包含有”#include'speak.h'“這句代碼,它的意思是搜索系統(tǒng)頭文件目錄之前將先在當(dāng)前目錄中搜索文件“speak.h“。而”speak.h“正在該目錄中,不用再在命令中指定了)。

3.源文件生成對(duì)象文件

選項(xiàng) -c 用來告訴編譯器編譯源代碼但不要執(zhí)行鏈接,輸出結(jié)果為對(duì)象文件。文件默認(rèn)名與源碼文件名相同,只是將其后綴變?yōu)?.o。例如,下面的命令將編譯源碼文件 hellospeak.cpp 并生成對(duì)象文件 hellospeak.o:

$ g++ -c hellospeak.cpp

命令 g++ 也能識(shí)別 .o 文件并將其作為輸入文件傳遞給鏈接器。下列命令將編譯源碼文件為對(duì)象文件并將其鏈接成單一的可執(zhí)行程序:

$ g++ -c hellospeak.cpp$ g++ -c speak.cpp$ g++ hellospeak.o speak.o -o hellospeak

選項(xiàng) -o 不僅僅能用來命名可執(zhí)行文件。它也用來命名編譯器輸出的其他文件。例如:除了中間的對(duì)象文件有不同的名字外,下列命令生將生成和上面完全相同的可執(zhí)行文件:

$ g++ -c hellospeak.cpp -o hspk1.o$ g++ -c speak.cpp -o hspk2.o $ g++ hspk1.o hspk2.o -o hellospeak

4.編譯預(yù)處理

選項(xiàng) -E 使 g++ 將源代碼用編譯預(yù)處理器處理后不再執(zhí)行其他動(dòng)作。下面的命令預(yù)處理源碼文件 helloworld.cpp 并將結(jié)果顯示在標(biāo)準(zhǔn)輸出中:

$ g++ -E helloworld.cpp

本文前面所列出的 helloworld.cpp 的源代碼,僅僅有六行,而且該程序除了顯示一行文字外什么都不做,但是,預(yù)處理后的版本將超過 1200 行。這主要是因?yàn)轭^文件 iostream 被包含進(jìn)來,而且它又包含了其他的頭文件,除此之外,還有若干個(gè)處理輸入和輸出的類的定義。

預(yù)處理過的文件的 GCC 后綴為 .ii,它可以通過 -o 選項(xiàng)來生成,例如:

$ gcc -E helloworld.cpp -o helloworld.ii

5.生成匯編代碼

選項(xiàng) -S 指示編譯器將程序編譯成匯編語言,輸出匯編語言代碼而後結(jié)束。下面的命令將由 C++ 源碼文件生成匯編語言文件 helloworld.s:

$ g++ -S helloworld.cpp

生成的匯編語言依賴于編譯器的目標(biāo)平臺(tái)。

6.創(chuàng)建靜態(tài)庫

靜態(tài)庫是編譯器生成的一系列對(duì)象文件的集合。鏈接一個(gè)程序時(shí)用庫中的對(duì)象文件還是目錄中的對(duì)象文件都是一樣的。庫中的成員包括普通函數(shù),類定義,類的對(duì)象實(shí)例等等。靜態(tài)庫的另一個(gè)名字叫歸檔文件(archive),管理這種歸檔文件的工具叫 ar 。

在下面的例子中,我們先創(chuàng)建兩個(gè)對(duì)象模塊,然后用其生成靜態(tài)庫。

頭文件 say.h 包含函數(shù) sayHello() 的原型和類 Say 的定義:

/* say.h */#include <iostream>void sayhello(void);class Say { private: char *string; public: Say(char *str) { string = str; } void sayThis(const char *str) { std::cout << str << ' from a static libraryn'; } void sayString(void);};

下面是文件 say.cpp 是我們要加入到靜態(tài)庫中的兩個(gè)對(duì)象文件之一的源碼。它包含 Say 類中 sayString() 函數(shù)的定義體;類 Say 的一個(gè)實(shí)例 librarysay 的聲明也包含在內(nèi):

/* say.cpp */#include 'say.h'void Say::sayString(){ std::cout << string << 'n';}Say librarysay('Library instance of Say');

源碼文件 sayhello.cpp 是我們要加入到靜態(tài)庫中的第二個(gè)對(duì)象文件的源碼。它包含函數(shù) sayhello() 的定義:

/* sayhello.cpp */#include 'say.h'void sayhello() { std::cout << 'hello from a static libraryn'; }

下面的命令序列將源碼文件編譯成對(duì)象文件,命令 ar 將其存進(jìn)庫中:

$ g++ -c sayhello.cpp $ g++ -c say.cpp $ ar -r libsay.a sayhello.o say.o

程序 ar 配合參數(shù) -r 創(chuàng)建一個(gè)新庫 libsay.a 并將命令行中列出的對(duì)象文件插入。采用這種方法,如果庫不存在的話,參數(shù) -r 將創(chuàng)建一個(gè)新的庫,而如果庫存在的話,將用新的模塊替換原來的模塊。

下面是主程序 saymain.cpp,它調(diào)用庫 libsay.a 中的代碼:

/* saymain.cpp */#include 'say.h'int main(int argc,char *argv[]){ extern Say librarysay; Say localsay = Say('Local instance of Say'); sayhello(); librarysay.sayThis('howdy'); librarysay.sayString(); localsay.sayString(); return(0);}

該程序可以下面的命令來編譯和鏈接:

$ g++ saymain.cpp libsay.a -o saymain

程序運(yùn)行時(shí),產(chǎn)生以下輸出:

hello from a static libraryhowdy from a static libraryLibrary instance of SayLocal instance of Say

總結(jié)

到此這篇關(guān)于linux下使用g++編譯cpp工程的文章就介紹到這了,更多相關(guān)linux g++編譯cpp內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Linux系統(tǒng)
相關(guān)文章:
主站蜘蛛池模板: 精品国产99 | 色偷偷人人澡人人爽人人模 | 欧美激情精品久久久久久 | 97视频在线观看网站 | 一区二区三区av夏目彩春 | 精品一区二区在线看 | 亚洲性视频| 不用播放器看的av | 一区欧美 | 久久久一区二区三区 | 日韩av在线播 | 国产午夜在线 | 91av免费观看 | 天堂亚洲网 | 日韩1区2区 | av中文字幕在线播放 | 国产精品一区二区不卡 | 成人在线视频观看 | 国产极品粉嫩美女呻吟在线看人 | 久久久久国产一区二区三区四区 | 欧美亚洲高清 | www日韩欧美 | 久久综合狠狠综合久久综合88 | 91成人精品 | 欧美色成人 | 成年人免费网站 | 午夜一区 | 久久精品国产一区二区电影 | 韩日精品一区 | 久久一区二区免费视频 | 中文字幕免费 | 成人欧美一区二区三区在线播放 | 情侣黄网站免费看 | 中文字幕av免费 | 久久精品国产免费 | 欧美一区二区三区在线 | 91资源在线 | 日韩一级精品视频在线观看 | xx视频在线 | 九九久视频 | 无毛av|