1. 程式人生 > >linux下使用g++編譯cpp工程

linux下使用g++編譯cpp工程

https://www.cnblogs.com/battlescars/p/cpp_linux_gcc.html

https://blog.csdn.net/stpeace/article/details/73302833

"undefined reference to" 問題彙總及解決方法 ------非常非常好的一篇文章

https://blog.csdn.net/stpeace/article/details/73302833

C++程式設計中相關檔案字尾

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

下面是一個儲存在檔案 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++ 標準庫而不用 標準庫。通過遵循原始碼的命名規範並指定對應庫的名字,用 gcc 來編譯連結 C++ 程式是可行的,如下例所示:
$ gcc helloworld.cpp -lstdc++ -o helloworld

選項 -l (ell) 通過新增字首 lib 和字尾 .a 將跟隨它的名字變換為庫的名字 libstdc++.a

。而後它在標準庫路徑中查詢該庫。gcc 的編譯過程和輸出檔案與 g++ 是完全相同的。

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

$ c++ helloworld.cpp -o helloworld

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

如果多於一個的原始碼檔案在 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“正在該目錄中,不用再在命令中指定了)。

3.原始檔生成物件檔案


相關推薦

linux使用g++編譯cpp工程

https://www.cnblogs.com/battlescars/p/cpp_linux_gcc.htmlhttps://blog.csdn.net/stpeace/article/details/73302833"undefined reference to" 問題彙

linux 環境 G++編譯cpp檔案

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

Linuxg++編譯thread出錯的的解決方法

ima 方法 解決 g++ bsp 技術分享 inf 編譯 linu 錯誤如下圖所示: 因為thread是C++11新加入的特性,所以我們在用g++編譯的時候不能直接用,需要在g++後面加上 -std=c++0x -pthread 如果是gcc編譯多線程的話則應該要

linuxg++ 編譯時動態庫和靜態庫的連結和標頭檔案問題

原來編譯的時候都是用的很隨意,沒用系統的總結一下,這幾天在編譯的時候遇到一些下問題,於是就總結一下,省得過幾天又給忘了。 1.動態庫和靜態庫簡介 靜態庫在程式連結的時候會自動的連結到程式裡,所以一旦編譯完成,靜態庫就不需要了,靜態庫以.a結尾。  動態庫在編譯時不會被連線到目的碼中,而是在程式執行

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

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

linux如何編譯c++工程專案

首先,你必須有一個Linux開發環境,這樣才能進行C++開發。筆者用的是安裝在虛擬機器中的Ubuntu 9.04,Ubuntu作業系統是沒帶C++編譯器g++。在連網的情況下,在終端中使用root超級使用者許可權輸入以下命令:sudo apt-get install g+

關於如何在make一個Linux的C/C++工程時,自動新增版本號、編譯日期等資訊

本篇的目的:在makefile裡,將系統當前的時間傳遞進待編譯的C/C++工程中,用以指示編譯執行的時間,以及版本資訊等。 不多說了,先來看效果: 當前時間:2017.01.20  0:29 編譯完成後執行效果: [email protected]:~/Desk

caffe使用g++編譯cpp檔案時 遇到 fatal error: cublas_v2.h: 沒有那個檔案或目錄

一、前言        在caffe下使用g++編譯cpp檔案生成bin檔案時突然遇到 fatal error: cublas_v2.h: 沒有那個檔案或目錄 這個吐血問題,通過查詢資料找到解決的方法了 二、g++編譯生成bin檔案        本人的編譯命令是 g++

mac使用vim gcc/g++ 編譯cpp(c++)檔案並執行

首先確認gcc和g++版本,二者是否一致 命令:gcc -v;g++ -v 然後vim 編寫c++檔案,比如:#include <iostream>..... 最後儲存的時候要注意,exit+:sav+cppname.cpp “.cpp”字尾保證編譯器識別是c+

LINUXPHP編譯添加相應的動態擴展模塊so(不需要重新編譯PHP,以openssl.so為例)

down get 階段 很多 習慣 lin 模塊 臨時 操作 本文轉自:原文鏈接 http://www.cnblogs.com/doseoer/p/4367536.html 網上我看到有很多相關的文章都是簡述這個問題的,但畢竟因為LINUX版本眾多,很多LIUNX命令或路

Linuxmemcache編譯安裝與基本使用

清空 .tar.gz 報錯 關閉window eas -- 編譯 url 圖片 memcache是一套分布式的高速緩存系統,特點為key-value 存儲 一、在 linux 編譯安裝memcache、redis等,需要 gcc,make,cmake,autoconf,

LinuxClion編譯Cmake報錯的解決方案

        前段時間,在linux下安裝了一個C++ 開發的神奇,由JetBrain公司開發的IDE--CLion。之所以稱CLion為神器的原因是因為,在linux下沒有比這款IDE更強大的開發工具了。       &n

如何加速Linux編譯速度(加速make)

專案越來越大,每次需要重新編譯整個專案都是一件很浪費時間的事情。Research了一下,找到以下可以幫助提高速度的方法,總結一下。 tmpfs 有人說在Windows下用了RAMDisk把一個專案編譯時間從4.5小時減少到了5分鐘,也許這個數字是有點誇張了,不過粗想想,把檔案放

Linux交叉編譯Android工具鏈

搭建交叉編譯環境 下載Android NDK http://developer.android.com/sdk/ndk/index.html 我這邊選擇下載Linux 64-bit(x86),android-ndk-r9d-linux-x86_64.tar.bz2。

Linux交叉編譯生成iOS工具鏈指導手冊

1.前言  我們需要在Linux系統上實現交叉編譯並動態下發Android和iOS的靜態庫或者動態庫,而其中最為關鍵的就是Android NDK和iOS工具鏈的生成。由於Android 的實現起來相對容易,這裡重點講述iOS端生成工具鏈的實現過程。下面的操作需要在Macbook上到處S

Linux maven 編譯 spark 原始碼

1. 安裝maven  1)將安裝包解壓到指定目錄: [[email protected] apache-maven-3.5.3]# tar -zxf /opt/maven/apache-maven-3.5.3-bin.tar.gz -C /usr/local/

Linux原始碼編譯安裝mariadb資料庫

環境:centos7 準備:mariadb-10.2.18.tar 資料庫安裝包 [[email protected] ~]# rz Transferring mariadb-10.2.18.tar.gz... 第一步: 建立mysql使用者 [[email 

音訊模組基於最新Webrtc在Linux編譯

Webrtc中音訊模組的單獨編譯 版權宣告:本文為博主原創文章,若需轉載請註明出處。 在我們的嵌入式專案中,想要使用webrtc的音訊處理邏輯及相關網路功能。由於整個webrtc工程過於巨大,所以嘗試單獨編譯某個模組以供呼叫。 見上一篇部落格,經過編譯的音訊模組效果顯著,可是在

LVGUI在嵌入式LINUX編譯

    本文比較亂,算是一個隨筆,記錄一下將LVGUI交叉編譯到MIPS架構的嵌入式Linux裝置中,主要關於自己編寫對應的makefile來對LVGUI進行編譯。 首先,Makefile 最好和lv的幾個工程目錄在同一目錄下,如下圖: 其次,為了讓標頭檔案(h檔

linuxPHP編譯安裝程式碼踩過的坑解決

坑1:編譯之前需要:需要安裝gcc 和 autoconfig,要不然安裝編譯不成功的!(如果系統有就不需要安裝了!) 坑2:解壓出來的PHP檔案裡的php.ini xxx 複製到在編譯PHP目錄下etc下。 坑3:如果php.ini 不生效,用命令  php -i | g