最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux環(huán)境使用g++編譯C++方法總結(jié)

 更新時(shí)間:2018年03月25日 13:58:48   作者:hnyzwtf  
本篇文章給大家分享了在Linux環(huán)境中用g++編譯C++的方法以及相關(guān)實(shí)例代碼分享,有興趣的朋友學(xué)習(xí)下。

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

下面是一個(gè)保存在文件 helloworld.cpp 中一個(gè)簡(jiǎn)單的 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è)簡(jiǎn)單的字符串。該代碼可用以下命令編譯為可執(zhí)行文件:

$ g++ helloworld.cpp

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

$ ./a.out
hello, world

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

$ g++ helloworld.cpp -o helloworld

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

$ ./helloworld
hello, world

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

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

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

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

$ c++ helloworld.cpp -o helloworld

多個(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:這里說(shuō)一下為什么在命令中沒(méi)有提到“speak.h“該文件(原因是:在“speak.cpp“中包含有”#include"speak.h"“這句代碼,它的意思是搜索系統(tǒng)頭文件目錄之前將先在當(dāng)前目錄中搜索文件“speak.h“。而”speak.h“正在該目錄中,不用再在命令中指定了)。

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

選項(xiàng) -c 用來(lái)告訴編譯器編譯源代碼但不要執(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 不僅僅能用來(lái)命名可執(zhí)行文件。它也用來(lái)命名編譯器輸出的其他文件。例如:除了中間的對(duì)象文件有不同的名字外,下列命令生將生成和上面完全相同的可執(zhí)行文件:

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

編譯預(yù)處理

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

$ g++ -E helloworld.cpp

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

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

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

生成匯編代碼

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

$ g++ -S helloworld.cpp

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

創(chuàng)建靜態(tài)庫(kù)

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

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

頭文件 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 library\n";
    }
    void sayString(void);
};

下面是文件 say.cpp 是我們要加入到靜態(tài)庫(kù)中的兩個(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)庫(kù)中的第二個(gè)對(duì)象文件的源碼。它包含函數(shù) sayhello() 的定義:

/* sayhello.cpp */
#include "say.h"
void sayhello()
{
  std::cout << "hello from a static library\n";
}

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

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

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

下面是主程序 saymain.cpp,它調(diào)用庫(kù) 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);
}

該程序可以下面的命令來(lái)編譯和鏈接:

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

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

hello from a static library
howdy from a static library
Library instance of Say
Local instance of Say

ps:如果一個(gè)文件夾下有多個(gè)cpp文件需要編譯的話,除了采用makefile的方式之外,還可以使用“g++ *.cpp -o hello",“hello為編譯生成的可執(zhí)行文件的名字”,編譯時(shí)要確保cpp文件和他們各自所引用的頭文件在同一個(gè)目錄下。

相關(guān)文章

  • Windows 10利用虛擬機(jī)安裝Linux圖文教程

    Windows 10利用虛擬機(jī)安裝Linux圖文教程

    這篇文章主要為大家詳細(xì)介紹了Windows 10利用虛擬機(jī)安裝Linux的圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 如何優(yōu)雅地刪除 Linux 中的垃圾文件的方法

    如何優(yōu)雅地刪除 Linux 中的垃圾文件的方法

    這篇文章主要介紹了如何優(yōu)雅地刪除 Linux 中的垃圾文件的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • crontab定時(shí)任務(wù)不執(zhí)行的一些原因總結(jié)

    crontab定時(shí)任務(wù)不執(zhí)行的一些原因總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于crontab定時(shí)任務(wù)不執(zhí)行的一些原因,對(duì)每種可能發(fā)生的原因都給出了解決方法,對(duì)遇到這個(gè)問(wèn)題的朋友們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Linux和window環(huán)境下開(kāi)放防火墻端口的操作

    Linux和window環(huán)境下開(kāi)放防火墻端口的操作

    開(kāi)發(fā)時(shí)會(huì)遇到在服務(wù)器上部署mysql或者es數(shù)據(jù)庫(kù)的情況,此時(shí)如果訪問(wèn)數(shù)據(jù)庫(kù)就需要開(kāi)放防火墻端口,本文會(huì)講解windows和linux環(huán)境下端口的開(kāi)放,文章通過(guò)圖文結(jié)合的方式講解的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • Linux之常見(jiàn)漏洞修復(fù)

    Linux之常見(jiàn)漏洞修復(fù)

    這篇文章主要介紹了Linux中的常見(jiàn)漏洞修復(fù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • linux 使用bond實(shí)現(xiàn)雙網(wǎng)卡綁定單個(gè)IP的示例代碼

    linux 使用bond實(shí)現(xiàn)雙網(wǎng)卡綁定單個(gè)IP的示例代碼

    這篇文章主要介紹了linux 使用bond實(shí)現(xiàn)雙網(wǎng)卡綁定單個(gè)IP的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • inux下gettimeofday函數(shù)windows替換方法(詳解)

    inux下gettimeofday函數(shù)windows替換方法(詳解)

    下面小編就為大家?guī)?lái)一篇inux下gettimeofday函數(shù)windows替換方法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • Apache Pulsar 微信大流量實(shí)時(shí)推薦場(chǎng)景下實(shí)踐詳解

    Apache Pulsar 微信大流量實(shí)時(shí)推薦場(chǎng)景下實(shí)踐詳解

    這篇文章主要為大家介紹了Apache Pulsar 微信大流量實(shí)時(shí)推薦場(chǎng)景下實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 詳解Linux重定向用法

    詳解Linux重定向用法

    這篇文章主要介紹了Linux重定向用法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Centos6 網(wǎng)絡(luò)配置的實(shí)例詳解

    Centos6 網(wǎng)絡(luò)配置的實(shí)例詳解

    這篇文章主要介紹了Centos6 網(wǎng)絡(luò)配置的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能夠掌握配置網(wǎng)絡(luò)的知識(shí),需要的朋友可以參考下
    2017-09-09

最新評(píng)論

肇源县| 祁东县| 灵石县| 得荣县| 白朗县| 沙洋县| 安丘市| 广平县| 儋州市| 永泰县| 太原市| 怀化市| 武功县| 鄱阳县| 东阳市| 梅州市| 稻城县| 汝州市| 台山市| 楚雄市| 阿合奇县| 秦安县| 花垣县| 奉化市| 略阳县| 岑巩县| 安义县| 扎赉特旗| 平乐县| 安泽县| 双牌县| 华坪县| 玉林市| 鄄城县| 凌云县| 太和县| 交口县| 淳化县| 花垣县| 西贡区| 胶州市|