C 編譯連線總結(一) g

2021-07-13 21:00:05 字數 2547 閱讀 9606

快速入門例子

g++ –c a.cpp  編譯檔案,生成目標檔案 a.o

g++ a.o –o abc  連線 並重命名為可執行檔案 abc

(g++ -c a.cpp -o a  之後 g++ a 會儲存的,親驗)

g++ a.cpp    編譯連線一起,生成a.out

g++ a.cpp –o hello 生成a.out並命名為hello

涉及靜態動態庫的後面說

詳細說明

-c:

編譯或彙編原始檔

,但不作連線.

編譯器輸出對應於原始檔的目標檔案.

預設情況下

, g++

通過用.o替換源檔名字尾產生目標檔名

.可以使用

-o選項選擇其他名字

樣例:g++ -c a.cpp    

輸出檔案 

a.o

g++ -c a.cpp -o a   輸出檔案 a

-o ***:

指定輸出檔案為

***.

該選項不在乎

g++產生什麼輸出

,無論是可執行檔案

,目標檔案

,彙編檔案還是預處理後的c**

. 如果沒有使用

-o選項

, 預設的輸出結果是:

1. 可執行檔案為

a.out

2. source.suffix

的目標檔案是

source.o

3. 彙編檔案是 

source.s

4. 而預處理後的

c源**送往標準輸出.

樣例:g++ -c a.cpp -o a   輸出檔案 a

-wall   (同-w)

輸出所有編譯警告資訊,

建議一定要加上

g++ a.cpp -w

比如在main中輸出乙個沒有初始化的變數

a.cpp: in function 『int main()』:

a.cpp:7:13: warning: 『a』 is used uninitialized in this function [-wuninitialized]

std::cout<

-

d

***=***

定義巨集,類似於

#define的功能

樣例: 

g++ a.cpp -db=10   

#define b 10

-l ***

在庫檔案的搜尋路徑列表中新增

dir 目錄.

,可新增多個

gcc -o hello2 m.cpp 

-l ./1 -l . -lmyhello2   -wl,--rpath=./1

-llibrar

ytest

(小寫的l)

1. 2.聯結器在標準搜尋目錄中尋找這個庫檔案,庫檔案的真正名字是

libl

ibrar

ytest

(動態庫

)lib

l

ibrar

ytest

(靜態庫)

3.是按嚴格檔名搜尋 ,如果

so檔名帶版本號,需要建立軟連線

4.編譯時搜尋目錄包括 :

1. 使用者以

`-l'

選項指定的路徑   

2.library_path  ( 是環境變數用於在

程式編譯期間

查詢動態鏈結庫時指定查詢共享庫的路徑)

3.系統目錄

/lib/

usr/lib

5.執行時搜尋目錄包括 :

1.ld_library_path(用於在

程式載入執行期間

查詢動態鏈結庫時指定除了系統預設路徑之外的其他路徑)

2.ld.so.cache

&/etc/

ld.so.conf

3.系統目錄

/lib/

usr/lib

6.動態庫和靜態庫同名時,優先使用動態庫

-idir

( 大寫的i)

在標頭檔案的搜尋路徑列表中新增

dir 目錄.

-shared

生成乙個共享庫檔案

g++-shared

-olibtest.so

bdb.o

-fpic

編譯器生成位置無關目標碼,適用於動態連線

(dynamic linking)

g 編譯總結

一 編譯注意細節 1.使用g 編譯cpp檔案如果用gcc編譯c 原始檔時,加以下選項 lstdc 否則使用了c 操作的檔案編譯會出錯。2.gcc g 在執行編譯時,需要4步 預處理,生成.i的檔案 使用 e引數 將預處理後的檔案不轉換成組合語言,生成檔案.s 使用 s引數 有彙編變為目標 機器 生成...

g 編譯連線命令簡介

gcc g 現在是gnu中最主要和最流行的c c 編譯器 g 是c 的命令,以.cpp為主,對於c語言字尾名一般為.c。這時候命令換做gcc即可。其實是無關緊要的。其實編譯器是根據gcc還是g 來確定是按照c標準還是c 標準編譯鏈結。下面以test.cpp為例 命令 g test.cpp 功能 生成...

C 學習筆記 一 g 編譯

程式 g 是將 gcc 預設語言設為 c 的乙個特殊的版本,鏈結時它自動使用 c 標準庫而不用 c 標準庫。通過遵循原始碼的命名規範並指定對應庫的名字,用 gcc 來編譯鏈結 c 程式是可行的,如下 gcc main.cpp lstdc o maing helloworld.cpp由於命令列中未指定...