1. 程式人生 > >ubuntu環境下使用G++編譯C++

ubuntu環境下使用G++編譯C++

單個原始檔生成可執行程式

下面是一個儲存在檔案 helloworld.cpp 中一個簡單的 C++ 程式的程式碼:

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

程式使用定義在標頭檔案 iostream 中的 cout,向標準輸出寫入一個簡單的字串。該程式碼可用以下命令編譯為可執行檔案:

$ g++ helloworld.cpp

編譯器 g++ 通過檢查命令列中指定的檔案的字尾名可識別其為 C++ 原始碼檔案。編譯器預設的動作:編譯原始碼檔案生成物件檔案(object file),連結物件檔案和 libstdc++ 庫中的函式得到可執行程式。然後刪除物件檔案。由於命令列中未指定可執行程式的檔名,編譯器採用預設的 a.out。程式可以這樣來執行:

$ ./a.out
hello, world

更普遍的做法是通過 -o 選項指定可執行程式的檔名。下面的命令將產生名為 helloworld 的可執行檔案:

$ g++ helloworld.cpp -o helloworld

在命令列中輸入程式名可使之執行:

$ ./helloworld
hello, world

程式 g++ 是將 gcc 預設語言設為 C++ 的一個特殊的版本,連結時它自動使用 C++ 標準庫而不用 C 標準庫。通過遵循原始碼的命名規範並指定對應庫的名字,用 gcc 來編譯連結 C++ 程式是可行的,如下例所示:

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

選項 -l (ell) 通過新增字首 lib 和字尾 .a 將跟隨它的名字變換為庫的名字 libstdc++.a。而後它在標準庫路徑中查詢該庫。gcc 的編譯過程和輸出檔案與 g++ 是完全相同的。

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

$ c++ helloworld.cpp -o helloworld

多個原始檔生成可執行程式

如果多於一個的原始碼檔案在 g++ 命令中指定,它們都將被編譯並被連結成一個單一的可執行檔案。下面是一個名為 speak.h 的標頭檔案;它包含一個僅含有一個函式的類的定義:

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

下面列出的是檔案 speak.cpp 的內容:包含 sayHello() 函式的函式體:

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

檔案 hellospeak.cpp 內是一個使用 Speak 類的程式:

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

下面這條命令將上述兩個原始碼檔案編譯連結成一個單一的可執行程式:

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

PS:這裡說一下為什麼在命令中沒有提到“speak.h“該檔案(原因是:在“speak.cpp“中包含有”#include"speak.h"“這句程式碼,它的意思是搜尋系統標頭檔案目錄之前將先在當前目錄中搜索檔案“speak.h“。而”speak.h“正在該目錄中,不用再在命令中指定了)。

原始檔生成物件檔案

選項 -c 用來告訴編譯器編譯原始碼但不要執行連結,輸出結果為物件檔案。檔案預設名與原始碼檔名相同,只是將其後綴變為 .o。例如,下面的命令將編譯原始碼檔案 hellospeak.cpp 並生成物件檔案 hellospeak.o:

$ g++ -c hellospeak.cpp
  

命令 g++ 也能識別 .o 檔案並將其作為輸入檔案傳遞給連結器。下列命令將編譯原始碼檔案為物件檔案並將其連結成單一的可執行程式:

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

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

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

編譯預處理

選項 -E 使 g++ 將原始碼用編譯前處理器處理後不再執行其他動作。下面的命令預處理原始碼檔案 helloworld.cpp 並將結果顯示在標準輸出中:

$ g++ -E helloworld.cpp

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

預處理過的檔案的 GCC 字尾為 .ii,它可以通過 -o 選項來生成,例如:

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

生成彙編程式碼

選項 -S 指示編譯器將程式編譯成組合語言,輸出組合語言程式碼而後結束。下面的命令將由 C++ 原始碼檔案生成組合語言檔案 helloworld.s:

$ g++ -S helloworld.cpp

生成的組合語言依賴於編譯器的目標平臺。

建立靜態庫

靜態庫是編譯器生成的一系列物件檔案的集合。連結一個程式時用庫中的物件檔案還是目錄中的物件檔案都是一樣的。庫中的成員包括普通函式,類定義,類的物件例項等等。靜態庫的另一個名字叫歸檔檔案(archive),管理這種歸檔檔案的工具叫 ar 。

在下面的例子中,我們先建立兩個物件模組,然後用其生成靜態庫。

標頭檔案 say.h 包含函式 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 是我們要加入到靜態庫中的兩個物件檔案之一的原始碼。它包含 Say 類中 sayString() 函式的定義體;類 Say 的一個例項 librarysay 的宣告也包含在內:
/* say.cpp */
#include "say.h"
void Say::sayString()
{
    std::cout << string << "\n";
}

Say librarysay("Library instance of Say");
原始碼檔案 sayhello.cpp 是我們要加入到靜態庫中的第二個物件檔案的原始碼。它包含函式 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 配合引數 -r 建立一個新庫 libsay.a 並將命令列中列出的物件檔案插入。採用這種方法,如果庫不存在的話,引數 -r 將建立一個新的庫,而如果庫存在的話,將用新的模組替換原來的模組。

下面是主程式 saymain.cpp,它呼叫庫 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

程式執行時,產生以下輸出:

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

相關推薦

linux 環境 G++編譯cpp檔案

今天興致勃勃地搗騰了一下午ubuntu(我的是ubuntu 9.10) ,感覺ubuntu還是很好用的 ,是一個對linux初學者度過適應期的不錯的作業系統。由於剛剛接觸C++,不免心生一股編寫C++程式的熱情。於是編寫了一個很簡單的C++ 程式 程式碼:(HelloCpp

ubuntu環境重新編譯核心

由於除錯核心、驅動或工作需要,有可能需要對ubuntu下的核心進行重新編譯,本文對核心重新編譯過程進行簡單分析,在進行重新編譯核心前你可以通過uname -a來確認你的linux系統的當前版本。 1.根據你的需要獲取核心原始碼,獲取核心原始碼有兩種方式,一種是直接到h

ubuntu環境使用G++編譯C++

單個原始檔生成可執行程式 下面是一個儲存在檔案 helloworld.cpp 中一個簡單的 C++ 程式的程式碼: /* helloworld.cpp */ #include <iostream> int main(int argc,char *argv[])

Ubuntueclipse編譯c/c++環境配置

1,下載帶CDT外掛的eclipse版本        sudo apt-get install eclipse-cdt 2,安裝後啟動建立c++專案,然後在/project/properties下修改相關配置如下圖。不然會出現

VLC-Android 在ubuntu環境編譯

由於在使用vlc的過程中發現了關閉資源需要30s的bug,所以準備自己編譯一個vlc的最新版本的庫來。 環境準備官網wiki ubuntu16+ 第一步:需要安裝好ubuntu,作者是在mac上安裝的ubuntu的虛擬機器來進行編譯的 編譯環境 sudo apt-get

Linux環境如何編譯和執行c程式

1 單個檔案的編譯和執行 建立main.c檔案,內容如下:  編譯: 執行: 2 多個檔案的編譯和執行建立sum.c檔案,內容如下: 建立main.c檔案,內容如下:   編譯:    生成可執行檔案,檔名為main: 執行程式:

Linux環境如何編譯和執行c程序

文件的 ron 當前 cto directory 變量 沒有 執行文件 nbsp 1 單個文件的編譯和執行 創建main.c文件,內容如下: 編譯: 執行: 2 多個文件的編譯和執行創建sum.c文件,內容如下: 創建main.c文件,內容如下: 編譯:

ubuntudlib編譯C++(共享庫)及使用,即cmake編譯dlib開原始檔的步驟和檔案結構,

一、cmake的工作機制         使用CMake很簡單。 構建過程是通過建立一個或多個CMakeLists檔案(實際上是CMakeLists.txt,但本指南將在大多數情況下脫離擴充套件)控制在專案的每個目錄中。

Ubuntu環境編譯V8

Ubuntu版本:14.04 關於V8 V8是Google自己開發的高效能開源的JavaScript解析引擎。 下載原始碼 原始碼地址 根據文件中的介紹,首先看depot tools是否安裝。 然後下載v8原始碼: fetch v8

Ubuntu環境編譯caffe-fast-rcnn出現"fatal error: hdf5.h: 沒有那個檔案或目錄"的錯誤

我想跑一跑faster rcnn的resnet實現,因此從Github(https://github.com/Eniac-Xie/faster-rcnn-resnet)上下載了程式碼,並按照其指示(如下圖)進行編譯.我的環境是優麒麟16.04.當執行第4步中的"make al

LinuxG++編譯第一個C++程式(Hello, world)

安裝完各種環境工具之後(sudo apt install g++) 繼而新建一個空白文件Helloworl.cpp,貼上進最簡單的程式碼: #include<iostream>

linux環境vscode 中C/C++編譯及除錯環境的搭建

0.確定安裝了GCC,沒有安裝的話sudo apt-get install gcc1.下載vscode並安裝,建議deb包2.開啟vscode,安裝擴充套件外掛,其中C/C++為必裝,提供C/C++支援Code Runner必裝,提供編譯後程序的執行環境C/C++ Snipp

Ubuntu環境 matplotlib 圖例中文亂碼

中文本文前提條件是 已經 安裝好 matplotlib , 至於 matplotlib 是什麽, 怎麽安裝, 本文不予介紹。 首先在 Windows 盤區下 找到 微軟雅黑 的字體文件: 其次,找到 matplotlab 字體庫 文件夾 或者 系統字體庫文件夾 matp

Ubuntu環境GitHub安裝與使用

process 兩種 ted 上傳 config err touch .com cte 安裝git sudo apt-get update sudo apt-get install git 1 2 1 2 配置 你的github git config --glo

ubuntu環境安裝Redis

using isa eboot clas lis ava blog enabled push 1.命令行安裝 sudo apt-get update sudo apt-get install redis-server 2.啟動redis $redis-server

Ubuntu環境,項目出現:Call to undefined function curl_init() 提示

pre color col ubunt -c php mys defined pan 原因: 沒有開啟curl擴展 安裝或者開啟擴展 ubuntu 執行安裝Curl的擴展 sudo apt-get install -y php-curl

ubuntu 環境 gerrit添加ssh key

說明 con code 當前 mage mail use ubuntu cat 1、輸入 ssh-keygen,生成密鑰文件,選擇保存目錄(一般選擇默認路徑,直接輸入回車); 2、輸入 cat /home/fieldwang/.ssh/id_rsa.pub,查看密鑰文

Mac OS X10.10_xcode6.1_ios8.1環境編譯lame靜態庫libmp3lame.a,支持arm64 armv7s x86_64 i386 armv7指令集

ces mod dir helper plain per 代碼 then -m 近期升級了系統到Mac OS X 10.10 而且更新了XCode6.1和iOS 8

Ubuntu環境掛載新硬盤

磁盤掛載一、硬盤分區 | Hard disk add new partition1、顯示硬盤及所屬分區情況。在終端窗口中輸入如下命令:sudo fdisk -l顯示當前的硬盤及所屬分區的情況。如下圖所示:系統提示:DIsk /dev/sdb doesn't contain a valid partit

Linux 環境手工編譯安裝Apache

Apache手工編譯安裝Apache 實驗準備: 1.VMwore 12 環境下Red Hat 6.5版本虛擬機一臺 2.相關軟件包:apr、apr-util、httpd 備註:apache官網下載http://www.apache.org/ 將實驗所需的軟件包下載好,並解壓到指定文件夾 `` 一、Apach