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

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

 更新時間:2020年03月26日 10:04:11   作者:BattleScars  
這篇文章主要介紹了linux下使用g++編譯cpp工程的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

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

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

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

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

$ g++ helloworld.cpp

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

$ ./a.out
hello, world

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

 $ g++ helloworld.cpp -o helloworld

在命令行中輸入程序名可使之運行:

 $ ./helloworld 
hello, world

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

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

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

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

 $ c++ helloworld.cpp -o helloworld

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

如果多于一個的源碼文件在 g++ 命令中指定,它們都將被編譯并被鏈接成一個單一的可執(zhí)行文件。下面是一個名為 speak.h 的頭文件;它包含一個僅含有一個函數(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)是一個使用 Speak 類的程序:

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

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

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

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

3.源文件生成對象文件

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

$ g++ -c hellospeak.cpp

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

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

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

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

4.編譯預處理

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

 $ g++ -E helloworld.cpp

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

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

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

5.生成匯編代碼

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

$ g++ -S helloworld.cpp

生成的匯編語言依賴于編譯器的目標平臺。

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

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

在下面的例子中,我們先創(chuàng)建兩個對象模塊,然后用其生成靜態(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 library\n";
 }
 void sayString(void);
};

下面是文件 say.cpp 是我們要加入到靜態(tài)庫中的兩個對象文件之一的源碼。它包含 Say 類中 sayString() 函數(shù)的定義體;類 Say 的一個實例 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)庫中的第二個對象文件的源碼。它包含函數(shù) sayhello() 的定義:

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

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

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

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

下面是主程序 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

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

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

總結(jié)

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

相關(guān)文章

  • C++使用文件實現(xiàn)學生信息管理系統(tǒng)

    C++使用文件實現(xiàn)學生信息管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++使用文件實現(xiàn)學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C++指針數(shù)組、數(shù)組指針、數(shù)組名及二維數(shù)組技巧匯總

    C++指針數(shù)組、數(shù)組指針、數(shù)組名及二維數(shù)組技巧匯總

    這篇文章主要介紹了C++指針數(shù)組、數(shù)組指針、數(shù)組名及二維數(shù)組技巧匯總,對于深入理解C++數(shù)組與指針來說非常重要,需要的朋友可以參考下
    2014-08-08
  • Qt數(shù)據(jù)庫相關(guān)應用開發(fā)總結(jié)

    Qt數(shù)據(jù)庫相關(guān)應用開發(fā)總結(jié)

    這篇文章主要為大家介紹了在Qt數(shù)據(jù)庫應用開發(fā)中的一些經(jīng)驗總結(jié),以及一些組件的使用介紹。文中的示例代碼講解詳細,需要的可以參考一下
    2022-02-02
  • C++中函數(shù)模板與類模板的簡單使用及區(qū)別介紹

    C++中函數(shù)模板與類模板的簡單使用及區(qū)別介紹

    這篇文章介紹了C++中的模板機制,包括函數(shù)模板和類模板的概念、語法和實際應用,函數(shù)模板通過類型參數(shù)實現(xiàn)泛型操作,而類模板允許創(chuàng)建可處理多種數(shù)據(jù)類型的類,文章還討論了模板的關(guān)鍵區(qū)別、注意事項以及它們在實際編程中的應用,感興趣的朋友一起看看吧
    2025-03-03
  • C++ 實戰(zhàn)開發(fā)一個猜單詞的小游戲

    C++ 實戰(zhàn)開發(fā)一個猜單詞的小游戲

    眾所周知紙上得來終覺淺,我們要在實戰(zhàn)中才能真正的掌握技術(shù),小編為大家?guī)硪环萦肅++編寫的猜單詞小游戲,給大家練練手,快來看看吧
    2021-11-11
  • C語言基于循環(huán)鏈表解決約瑟夫環(huán)問題的方法示例

    C語言基于循環(huán)鏈表解決約瑟夫環(huán)問題的方法示例

    這篇文章主要介紹了C語言基于循環(huán)鏈表解決約瑟夫環(huán)問題的方法,簡單描述了約瑟夫環(huán)問題并結(jié)合實例形式分析了C語言使用循環(huán)鏈表解決約瑟夫環(huán)問題的具體操作技巧,需要的朋友可以參考下
    2018-01-01
  • 詳解C語言通過遞歸與非遞歸實現(xiàn)蛇形矩陣

    詳解C語言通過遞歸與非遞歸實現(xiàn)蛇形矩陣

    蛇形矩陣(Snake matrix)是矩陣的一種,常被應用在編程題目與數(shù)學數(shù)列中,需要提取每條斜線里最小的數(shù)字,本篇文章將會通過遞歸和非遞歸來分別實現(xiàn)蛇形矩陣
    2022-02-02
  • 利用Matlab實現(xiàn)繪制中秋山間秋月和皓月當空效果

    利用Matlab實現(xiàn)繪制中秋山間秋月和皓月當空效果

    中秋節(jié)還有三天就到了,中秋節(jié)啊,闔家團圓的日子。本文將利用Matlab繪制中秋山間秋月和皓月當空的動態(tài)效果,感興趣的可以了解一下
    2022-09-09
  • C++11中std::declval的實現(xiàn)機制淺析

    C++11中std::declval的實現(xiàn)機制淺析

    這篇文章主要給大家介紹了關(guān)于C++11中std::declval實現(xiàn)機制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-07-07
  • C程序中可怕的野指針圖文詳解

    C程序中可怕的野指針圖文詳解

    這篇文章主要給大家介紹了關(guān)于C程序中可怕的野指針的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C程序具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07

最新評論

甘谷县| 资溪县| 赣州市| 广元市| 资阳市| 元氏县| 富蕴县| 建阳市| 东海县| 蒲城县| 怀宁县| 甘谷县| 融水| 阿鲁科尔沁旗| 乐都县| 林口县| 淄博市| 遵义县| 黑龙江省| 吉首市| 屯留县| 鄂伦春自治旗| 青岛市| 甘南县| 兴国县| 东丽区| 华池县| 安新县| 攀枝花市| 大邑县| 广河县| 河源市| 阿城市| 尉犁县| 松阳县| 本溪市| 三台县| 廊坊市| 遂川县| 蓬安县| 通渭县|