gcc/g++ 經常使用參數

編譯的步驟

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

1.預處理,生成.i的文件[預處理器cpp]。 對應的參數是 -E 2.將預處理後的文件不轉換成彙編語言,生成文件.s[編譯器egcs]。對應的參數是 -S 3.有彙編變爲目標代碼(機器代碼)生成.o的文件[彙編器as]。對應的參數是 -c 4.鏈接目標代碼,生成可執行程序[連接器ld]。無參數。linux

編譯步驟舉例

有三個文件f1.h、f1.cc、test.cc 內容分別爲: f1.hios

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

f1.ccc++

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

using namespace std;

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

test.ccshell

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

using namespace std;

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

編譯連接過程以下:windows

<!-- lang: shell -->
[root@VM-127-178 gcc_test]# ls
f1.cc  f1.h  test.cc
[root@VM-127-178 gcc_test]# g++ -S f1.cc
[root@VM-127-178 gcc_test]# g++ -S test.cc
[root@VM-127-178 gcc_test]# ls
f1.cc  f1.h  f1.s  test.cc  test.s
[root@VM-127-178 gcc_test]# g++ -c f1.s
[root@VM-127-178 gcc_test]# g++ -c test.s
[root@VM-127-178 gcc_test]# ls
f1.cc  f1.h  f1.o  f1.s  test.cc  test.o  test.s
[root@VM-127-178 gcc_test]# g++ f1.o test.o
[root@VM-127-178 gcc_test]# ls
a.out  f1.cc  f1.h  f1.o  f1.s  test.cc  test.o  test.s
[root@VM-127-178 gcc_test]# ./a.out
f1()
hello
[root@VM-127-178 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   生成全部警告信息。spa

-static   此選項將禁止使用動態庫,因此,編譯出來的東西,通常都很大,也不須要什麼動態鏈接庫,就能夠運行. -shared   編譯成動態連接庫。一般用在創建共享庫時。 須要配合參數-fPIC使用。

某個程序在運行中要調用某個動態連接庫函數的時候,操做系統首先會查看全部正在運行的程序,看在內存裏是否已有此庫函數的拷貝了。若是有,則讓其共享那一個拷貝;只有沒有才連接載入。在程序運行的時候,被調用的動態連接庫函數被安置在內存的某個地方,全部調用它的程序將指向這個代碼段。所以,這些代碼必須使用相對地址,而不是絕對地址。在編譯的時候,咱們須要告訴編譯器,這些對象文件是用來作動態連接庫的,因此要用地址不無關代碼(Position Independent Code (PIC))。注意:linux下進行鏈接的缺省操做是首先鏈接動態庫,也就是說,若是同時存在靜態和動態庫,不特別指定的話,將與動態庫相鏈接。轉自gcc的靜態庫和動態庫

相關文章
相關標籤/搜索