1. 程式人生 > >gcc/g++ 常用引數

gcc/g++ 常用引數

編譯的步驟

參考:gcc引數詳解 
gcc and g++分別是gnu的c & c++編譯器 gcc/g++在執行編譯工作的時候,總共需要4步

1.預處理,生成.i的檔案[前處理器cpp]。 對應的引數是 -E 
2.將預處理後的檔案不轉換成組合語言,生成檔案.s[編譯器egcs]。對應的引數是 -S 
3.有彙編變為目的碼(機器程式碼)生成.o的檔案[彙編器as]。對應的引數是 -c 
4.連線目的碼,生成可執行程式[連結器ld]。無引數。

編譯步驟舉例

有三個檔案f1.h、f1.cc、test.cc 
內容分別為: 
f1.h

<!-- lang: cpp -->
void f1();

f1.cc

<!-- lang: cpp -->
#include <iostream>
#include "f1.h"

using namespace std;

void f1()
{
    cout << "f1()" << endl;
}

test.cc

<!-- lang: cpp -->
#include <iostream>
#include "f1.h"

using namespace std;

int main()
{
    f1();
    cout << "hello"
<< endl; }

編譯連結過程如下:

<!-- lang: shell -->
[[email protected] gcc_test]# ls
f1.cc  f1.h  test.cc
[[email protected] gcc_test]# g++ -S f1.cc
[[email protected] gcc_test]# g++ -S test.cc
[[email protected] gcc_test]# ls
f1.cc  f1.h  f1.s  test.cc  test.s
[[email protected]
gcc_test]# g++ -c f1.s [[email protected] gcc_test]# g++ -c test.s [[email protected] gcc_test]# ls f1.cc f1.h f1.o f1.s test.cc test.o test.s [[email protected] gcc_test]# g++ f1.o test.o [[email protected] gcc_test]# ls a.out f1.cc f1.h f1.o f1.s test.cc test.o test.s [[email protected] gcc_test]# ./a.out f1() hello [[email protected] gcc_test]#

當然,gcc很聰明,可以一個命令編譯多個檔案。如:

<!-- lang: shell -->
g++ -c f1.s test.s

同時支援萬用字元。可以這樣:

<!-- lang: shell -->
g++ -o test *.cc

常用引數

-E 
  只啟用預處理,這個不生成檔案,你需要把它重定向到一個輸出檔案裡面. 
  例子用法: 
  gcc -E hello.c > pianoapan.txt 
  gcc -E hello.c | more 
  慢慢看吧,一個hello word 也要與處理成800行的程式碼 
-S 
  只啟用預處理和編譯,就是指把檔案編譯成為彙編程式碼。 
  例子用法 
  gcc -S hello.c 
  他將生成.s的彙編程式碼,你可以用文字編輯器察看 
-c 
  只啟用預處理,編譯,和彙編,也就是他只把程式做成obj檔案 
  例子用法: 
  gcc -c hello.c 
  他將生成.o的obj檔案 
-o 
  制定目標名稱,預設的時候,gcc 編譯出來的檔案是a.out,很難聽,如果你和我有同感 
,改掉它,哈哈 
  例子用法 
  gcc -o hello.exe hello.c (哦,windows用習慣了) 
  gcc -o hello.asm -S hello.c 
-l 
  需要連結的庫名稱。即連結庫檔案去掉lib字首和.so後的部分。如libev.so就是 -lev;libace.so就是 -lace。 
-L 
  連結庫檔案的搜尋路徑。 
  預設連結庫的搜尋路徑為/lib和/usr/lib。 
  實際的搜尋路徑可以參見本部落格的文章ldconfig , ldd 與 LD_LIBRARY_PATH 之間的關係 
  若安裝了新的開發包需要配置系統的連結配置。詳見 
-I 
  include標頭檔案的搜尋路徑。 
  當有此選項時,優先搜尋此路徑下的標頭檔案。然後按照#include後面是”“還是<>來決定是優先在當前目錄搜尋還是優先在系統目錄搜尋。 
  預設標頭檔案的路徑為當前目錄./ 和系統目錄 /usr/include /usr/local/include。 
-g 
  增加除錯資訊。 
-O0 
-O1 
-O2 
-O3 
  編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為預設值,-O3優化級別最高。 
-imacros file 
  將file檔案的巨集,擴充套件到gcc/g++的輸入檔案,巨集定義本身並不出現在輸入檔案中 
   
-Dmacro 
  相當於C語言中的#define macro 
   
-Dmacro=defn 
  相當於C語言中的#define macro=defn 
   
-Umacro 
  相當於C語言中的#undef macro 
-undef 
  取消對任何非標準巨集的定義

-w 
  不生成任何警告資訊。 
-Wall 
  生成所有警告資訊。

-static 
  此選項將禁止使用動態庫,所以,編譯出來的東西,一般都很大,也不需要什麼動態連線庫,就可以執行. 
-shared 
  編譯成動態連結庫。通常用在建立共享庫時。 需要配合引數-fPIC使用。

某個程式在執行中要呼叫某個動態連結庫函式的時候,作業系統首先會檢視所有正在執行的程式,看在記憶體裡是否已有此庫函式的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才連結載入。在程式執行的時候,被呼叫的動態連結庫函式被安置在記憶體的某個地方,所有呼叫它的程式將指向這個程式碼段。因此,這些程式碼必須使用相對地址,而不是絕對地址。在編譯的時候,我們需要告訴編譯器,這些物件檔案是用來做動態連結庫的,所以要用地址不無關程式碼(Position Independent Code (PIC))。注意:linux下進行連線的預設操作是首先連線動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連線。轉自gcc的靜態庫和動態庫

相關推薦

gcc/g++ 常用引數

編譯的步驟 參考:gcc引數詳解  gcc and g++分別是gnu的c & c++編譯器 gcc/g++在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案[前處理器cpp]。 對應的引數是 -E  2.將預處理後的檔案不轉換成組合語言,生成檔案

gcc/g++命令引數筆記

1. gcc -E source_file.c   -E,只執行到預編譯。直接輸出預編譯結果。 2. gcc -S source_file.c    -S,只執行到原始碼到彙編程式碼的轉換,輸出彙編程式碼。 3. gcc -c source_file.c   -c,只執行到編譯,輸出目標檔案。 4

gcc/g++ 編譯引數

1, -E(大寫),預處理 例子:gcc -E test.cpp -o test.i 預處理,把程式裡的#開頭的替換掉,比如#include,然後生成test.i 2,-P(大寫),去掉預處理生成的雜亂資訊 -E後生成的檔案裡面有很多雜亂的資訊,用-P可以去掉雜亂的資訊。 3,

【轉】gcc/g++常用編譯選項和gdb常用除錯命令

  gcc/g++編譯器是我們寫編譯C/C++程式時離不開的編譯工具,而gdb又是除錯C/C++程式的利器,這一篇文章我們記錄一下它們的慣常用法。 gcc/g++常用編譯選項 選項 作

gcc/g++命令引數中文幫助手冊

GCC 1 Section: GNU Tools (1) Updated: 2003/12/05 Other Links: GNU GPL Chinese NAME gcc,g++-GNU工程的C和C++編譯器(egcs-1.1.2) 總

gcc/g++常用編譯選項

-x language filename  設定檔案所使用的語言,使字尾名無效,對以後的多個有效.也就是根據約定,C語言的字尾名稱是.c的,而C++的字尾名是.C或者.cpp,如果你很個   性,決定你的C程式碼檔案的字尾名是.pig 哈哈,那你就要用這個引數,這個引數對他後

gccg++常用編譯參數

inf 其他 img asi 計算 但是 類型 文件 har -w -W -Wall   -w 關閉編譯警告。平時編寫c/c++代碼如果不規範,編譯的時候會拋出很多警告。但是一般的警告都是可以忽略的,比如類型轉換。編譯的時候可以加-w關閉警告   -W 也是關閉編譯警告,但

arm-linux-gcc 常用引數講解 gcc編譯器使用方法

我們需要編譯出執行在ARM平臺上的程式碼,所使用的交叉編譯器為 arm-linux-gcc。下面將arm-linux-gcc編譯工具的一些常用命令引數介紹給大家。 在此之前首先介紹下編譯器的工作過程,在使用GCC編譯程式時,編譯過程分為四個階段: 1. 預處理(Pre-Processing

gcc常用引數初探-來自第三章3.2的筆記-P113

gcc是一種C編譯器,這次我們根據書上的程式碼嘗試著使用它。 使用之前,先補充前置知識。編譯器將原始碼轉換為可執行程式碼的流程:首先,前處理器對原始碼進行處理,將#define指定的巨集進行替換,將#include包含的檔案插入,隨後,編譯器生成原始檔對應的彙編程式碼,以.s結尾。然後彙編器會將彙編程式碼轉

gcc g++ 編譯 wxwidgets的引數

簡單點: gcc編譯c程式,g++可編譯c和c++程式。 a.可行的命令格式 1.  g++ main.cpp -o c.out $(wx-config --cflags --libs) 2.  g++ $(wx-config --cflags) main.cpp -o a.

gcc 編譯器常用的命令列引數一覽

gcc是一個非常實用的Linux編譯器,在實際使用中會經常用到。 1. gcc -E source_file.c-E,只執行到預編譯。直接輸出預編譯結果。2. gcc -S source_file.c -S,只執行到原始碼到彙編程式碼的轉換,輸出彙編程式碼。3. gcc -

gcc常用引數

1 啟用1999 ISO C編譯器擴充套件:-std=c99[1]P149 gcc -std=c99 hello.c 2 啟用編譯器所推薦的警告訊息:-Wall[1]P149 gcc -Wall hello.c 3 啟動靜態連結:-static[1]P149

gcc命令常用選項引數詳解

gcc是GUN C和C++編譯器,我們通常使用GCC時,編譯器會依次做如下工作:preprocess(預處理),compilation(編譯),assembly(彙編),link(連結)。gcc提供了一些選項引數能夠讓編譯器停在某個過程(如編譯過程),比如 -c

[zz] GCC 常用引數

gcc/g++在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案[前處理器cpp] 2.將預處理後的檔案不轉換成組合語言,生成檔案.s[編譯器egcs] 3.有彙編變為目的碼(機器程式碼)生成.o的檔案[彙編器as] 4.連線目的碼,生成可執行程式[連結器ld]

Linux環境下C程式設計指南---gcc 編譯器常用的命令列引數一覽

1. gcc -E source_file.c-E,只執行到預編譯。直接輸出預編譯結果。2. gcc -S source_file.c -S,只執行到原始碼到彙編程式碼的轉換,輸出彙編程式碼。3. gcc -c source_file.c-c,只執行到編譯,輸出目標檔案。4. gcc (-E/S/c/) so

gcc編譯器常用的命令列引數一覽

1. gcc -E source_file.c-E,只執行到預編譯。直接輸出預編譯結果。2. gcc -S source_file.c -S,只執行到原始碼到彙編程式碼的轉換,輸出彙編程式碼。3. gcc -c source_file.c-c,只執行到編譯,輸出目標檔案。4. gcc (-E/S/c/) so

Linux GCC常用命令 與 gcc 編譯器常用的命令列引數一覽

轉載自:http://www.cnblogs.com/sunyubo/archive/2011/09/06/2282054.html 這些常用的 gcc/g++ 命令列引數,你都知道麼? 1. gcc -E source_file.c-E,只執行到預編譯。直接輸出預編譯結果

gcc -g -o -c分別是什麽意思

gcc linux-g為了調試用的 加個-g 是為了gdb 用,不然gdb用不到-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。-E:僅執行編譯預處理; -S:將C代碼轉換為匯編

gcc/g++基本命令

exe 註釋 esp 工作 return height 流行 根據 想要 gcc & g++現在是gnu中最主要和最流行的c & c++編譯器 。 g++是c++的命令,以.cpp為主,對於c語言後綴名一般為.c。這時候命令換做gcc即可。其實是無關緊要

gcc g++支持C++11 標準編譯及其區別

包含 別名 glob sin 你會 con 並且 c++程序 轉換成 g++ -g -Wall -std=c++11 main.cpp gcc -g -Wall -std=c11 main.cpp 如果不想每次寫這個-std=C++11這個選項該怎麽辦呢?   方法出