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 哈哈,那你就要用這個引數,這個引數對他後
gcc和g++常用編譯參數
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這個選項該怎麽辦呢? 方法出