鍍金池/ 教程/ C++/ linux環(huán)境下編譯C++ 程序
C++用戶(hù)定義異常
C++ this指針
C++存儲(chǔ)類(lèi)
C++函數(shù)
C++交換變量值
C++ continue語(yǔ)句
C++注釋
C++函數(shù)遞歸
C++ goto語(yǔ)句
C++函數(shù)-通過(guò)值調(diào)用和引用調(diào)用
C++重載
C++語(yǔ)言歷史
C++反轉(zhuǎn)數(shù)字
C++ try/catch語(yǔ)句
C++是什么?
C++變量
C++ break語(yǔ)句
C++運(yùn)算符
C++第一個(gè)程序
C++繼承
C++虛函數(shù)
C++將十進(jìn)制轉(zhuǎn)換為二進(jìn)制
C++矩陣乘法
C++對(duì)象和類(lèi)
C++基礎(chǔ)輸入輸出(cin,cout,endl)
C++文件和流
C++求素?cái)?shù)
C++ if/else語(yǔ)句
C++友元函數(shù)
C++命名空間
C++面向?qū)ο蟾拍?/span>
C++階乘
C++關(guān)鍵字
C++重載
C++聚合
C++結(jié)構(gòu)體
C++的特點(diǎn)(特性)
C++打印字母表三角
C++ switch語(yǔ)句
C++多態(tài)
C++ do-while循環(huán)
C++字符串
C++ static關(guān)鍵字
C++錯(cuò)誤處理
C++ for循環(huán)
C語(yǔ)言與C++的區(qū)別
C++ while循環(huán)
C++開(kāi)發(fā)環(huán)境的安裝
linux環(huán)境下編譯C++ 程序
C++枚舉
C++指針
C++斐波納契數(shù)列
C++阿姆斯壯數(shù)字
C++接口
C++教程
C++數(shù)組
C++數(shù)據(jù)抽象
C++回文程序?qū)嵗?/span>
C++打印數(shù)字三角
C++將數(shù)組傳遞到函數(shù)
C++多維數(shù)組
C++將數(shù)字轉(zhuǎn)換字符

linux環(huán)境下編譯C++ 程序

GCC(GNU Compiler Collection)是Linux下最主要的編譯工具,GCC不僅功能非常強(qiáng)大,結(jié)構(gòu)也異常靈活。它可以通過(guò)不同的前端模塊來(lái)支持各種語(yǔ)言,如:Java、Fortran、Pascal、Modula-3和Ada。

安裝Gcc和g++:

yum -y install gcc automake autoconf libtool make

安裝g++:

yum install gcc gcc-c++

g++是GCC中的一個(gè)工具,專(zhuān)門(mén)來(lái)編譯C++語(yǔ)言的。
GCC的參數(shù)有:( 也是分步實(shí)現(xiàn))

  • -E 讓GCC在預(yù)處理結(jié)束后停止編譯。
    g++ -E hello.cpp  -o  hello.i
    
  • -chello.i編譯成目標(biāo)代碼
    g++  -c  hello.i  -o  hello.o
    
    將目標(biāo)文件連接成可執(zhí)行文件
    g++ hell.o   -o   hello
    
    可以一步實(shí)現(xiàn)
    g++  hello.cpp  -o  hello
    

假如有兩個(gè)以上源文件應(yīng)該一下編譯

一步就實(shí)現(xiàn):

g++   foo1.cpp   foo2.cpp   -o   foo

也可以分步實(shí)現(xiàn):

g++   -c   foo1.cpp  -o   foo1.o
g++   -c    foo2.cpp  -o   foo2.o
g++   foo1.o  foo2.o    -o    foo

GCC一些常用選項(xiàng)

1、產(chǎn)生警告信息的選項(xiàng)大多數(shù)以-W開(kāi)頭 其中有-Wall

g++  -Wall  hello.cpp   -o   hello

2、將所有的警告當(dāng)成錯(cuò)誤的選項(xiàng)-Werror

g++ -Werror  hello.cpp  -o  hello

3、尋找頭文件選項(xiàng)

  • -I (linux默認(rèn)路徑:頭文件在/usr/include/下),不在這個(gè)路徑下就要用-I指定。
    gcc  foo.cpp  -I/home/include   -o  foo
    
    4、 庫(kù)依賴(lài)選項(xiàng)
  • -L (linux默認(rèn)路徑:庫(kù)文件在/usr/lib/下),不在這個(gè)路徑下就要用-L指定。
    g++  foo.cpp  -L/home/lib  -lfoo  -o   foo
    

庫(kù)就是將源文件編譯之后生成的目標(biāo)文件的集合。庫(kù)命名以lib開(kāi)頭。庫(kù)有靜態(tài)庫(kù)(通常以.a結(jié)尾)和動(dòng)態(tài)庫(kù)(通常以.so結(jié)尾)默認(rèn)情況下,g++以動(dòng)態(tài)庫(kù)形式連接。如果要靜態(tài)庫(kù)連接則要用-static指定(g++ foo.cpp -L/home/lib -static -lfoo -o foo)

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

下面是一個(gè)保存在文件 helloworld.cpp 中一個(gè)簡(jiǎn)單的 C++ 程序的代碼: 單個(gè)源文件生成可執(zhí)行程序。

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

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

[root@localhost cpp]# g++ helloworld.cpp
[root@localhost cpp]# ll
total 16
-rwxr-xr-x. 1 root   root   9136 Mar  8 03:31 a.out
-rw-rw-r--. 1 yiibai yiibai  138 Mar  8 03:24 helloworld.cpp
[root@localhost cpp]#

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

[yiibai@localhost cpp]$ ./a.out
hello, world
[yiibai@localhost cpp]$

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

[yiibai@localhost cpp]$  g++ helloworld.cpp -o helloworld
[yiibai@localhost cpp]$ ll
total 28
-rwxr-xr-x. 1 root   root   9136 Mar  8 03:31 a.out
-rwxrwxr-x. 1 yiibai yiibai 9136 Mar  8 03:32 helloworld
-rw-rw-r--. 1 yiibai yiibai  138 Mar  8 03:24 helloworld.cpp
[yiibai@localhost cpp]$

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

[yiibai@localhost cpp]$  ./helloworld
hello, world
[yiibai@localhost cpp]$

程序 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++ 程序是可行的,如下例所示:

[yiibai@localhost cpp]$ 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++ 是等同,如下例所示,用法也一致:

[yiibai@localhost cpp]$ c++ helloworld.cpp -o helloworld

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

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

/* 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 類(lèi)的程序:

/* 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

提示: 這里說(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)?code>.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è)處理輸入和輸出的類(lèi)的定義。
預(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ǔ)言依賴(lài)于編譯器的目標(biāo)平臺(tái)。

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

靜態(tài)庫(kù)是編譯器生成的一系列對(duì)象文件的集合。鏈接一個(gè)程序時(shí)用庫(kù)中的對(duì)象文件還是目錄中的對(duì)象文件都是一樣的。庫(kù)中的成員包括普通函數(shù),類(lèi)定義,類(lèi)的對(duì)象實(shí)例等等。靜態(tài)庫(kù)的另一個(gè)名字叫歸檔文件(archive),管理這種歸檔文件的工具叫 ar 。
在下面的例子中,我們先創(chuàng)建兩個(gè)對(duì)象模塊,然后用其生成靜態(tài)庫(kù)。
頭文件 say.h包含函數(shù) sayHello()的原型和類(lèi) 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 類(lèi)中 sayString()函數(shù)的定義體;類(lèi) Say 的一個(gè)實(shí)例 librarysay的聲明也包含在內(nèi):

/* say.cpp */
#include "say.h"
void Say::sayString()
{
    std::cout << string << "\n";
}

Say librarysay("Library instance of Say");
源碼文件 syshello.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ù)不存在的話(huà),參數(shù) -r 將創(chuàng)建一個(gè)新的庫(kù),而如果庫(kù)存在的話(huà),將用新的模塊替換原來(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 SayLocal instance of Say

參考:http://www.cnblogs.com/ucas/p/5778664.html