Linux筆記 7 gcc常用命令

2021-09-19 12:11:11 字數 2702 閱讀 7160

//在linux下,分別使用帶引數的g++命令對cpp檔案進行分步生成

g++ -e index.cpp -o index.i

g++ -s index.i -o index.s

g++ -c index.s -o index.o

g++ index.o -o index

//使用gcc編譯處理c程式

gcc -e sum.c -o sum.i

gcc -s sum.i -o sum.s

gcc -c sum.s -o sum.o

gcc sum.o -o sum

當不需要中間檔案生成時,直接使用不帶引數的指令

g++ index.cpp -o index

gcc sum.c -o sum

gcc下引數

1. 引數

(1) -e 預編譯 --> 生成.i檔案

(2) -s 編譯 --> 生成.s檔案

(3) -c 彙編 --> 生成.o檔案

(4) 鏈結 --> 生成exe檔案

(5) -o 指定生成的檔名

(6) -i 指定編譯的標頭檔案路徑

(7) -d 不在原始檔中定義巨集,而在編譯的時候定義

gcc sum.c -i include -d debug

(8) -o指定優化等級,num有效為0-3,0無優化,1為預設值,3優化級別最高

int a = 10; int b = a; int c = b; int d = c; --> 優化為:int a = 10; int d = 10;

(9) -wall 在編譯時輸出警告資訊

gcc sum.c -i include -d debug -o3 -wall

(10) -g gdb除錯時在程式中新增除錯資訊,生成的檔案會略大

(11) -v 檢視版本資訊

靜態庫的製作

1. 命名規則

(1) lib + 庫名字 + .a --> libmylib.a

2. 製作步驟

(1) 生成對應的.o 檔案 --> .c檔案 => -c => .o檔案

(2) 將生成的.o檔案打包 --> ar rcs + 靜態庫名稱(例如:libmylib.a) + 需要打包的所有.o檔案

3. 發布和使用靜態庫

(1) 發布靜態庫 --> 不用交付原始檔

(2) 提供標頭檔案 --> 標頭檔案中指明了可以呼叫的藉口

(3) 使用靜態庫(,,)

-l指定靜態庫的目錄,-l指定靜態庫的名稱,-i指定編譯所需標頭檔案的目錄,-o指定生成檔名

4. 檢視靜態庫

(1) nm --> nm libmycalc.a

(2) 可執行檔案中只包含靜態庫中使用了的.o檔案,而不會包含所有的被打包的.o檔案

靜態庫的優缺點

優點:

1. 發布程式的時候,不需要提供對應的庫

2. 載入庫的速度快

缺點: 1. 庫被打包到應用程式中,導致程式過大

2. 庫公升級需要重新編譯程式

共享庫的製作《類似windows下的dll>

1. 命名規則

(1) lib + 共享庫名稱 + .so --> libmycalc.so

2. 製作步驟

(1) 生成與位置無關的.o檔案《與位置無關指的是在共享庫中相對位址來表示,而不是絕對位址》

.c檔案 => -fpic -c => 與位置無關的.o檔案

gcc -fpic -c *.c

(2) 打包生成共享庫

gcc -shared -o 《共享庫名稱(libmysharedcalc.so)> 《需要打包的.o檔案(*.o)>

3. 發布和使用動態鏈結庫

(1) 發布動態鏈結庫

(2) 提供標頭檔案

(3) 使用動態鏈結庫(,,)

使用動態鏈結庫生成指定可執行檔案

使用該方法需要配置項使得動態鏈結器能夠找到share庫

動態鏈結器其實也是乙個動態鏈結庫 --> /lib64/ld-linux-x86-64.so.2

c. 檢視可執行程式的依賴庫

ldd 檢視exe執行的依賴庫

(4) 解決程式執行無法載入動態鏈結庫問題

a. 禁止使用方式

第一種方法是將動態鏈結庫放在根目錄下的lib下 --> 最好不要這樣做,避免影響系統庫

b. 用於臨時測試

第二種配置ld_library_path,使用export ld_library_path=./lib,將動態鏈結庫的目錄匯入其中,但僅限該終端有效

c. 不建議使用

第三種修改家目錄下.bashrc檔案,加入語句export ld_library_path= /etc/ld.so.conf

ii. 自身動態鏈結庫的路徑寫到配置檔案中

iii. 更新動態鏈結器 --> sudo ldconfig -v -v表示輸出資訊

動態庫的優缺點

優點:

1. 執行程式體積小

2. 動態庫更新不需要重新編譯程式

缺點:1. 發布程式時,需要提供動態庫給使用者

2. 載入速度較靜態庫慢些

GCC常用命令

1.gcc 原先指 gun c complier,現指 gun complier collections。2.mingw 3.常用命令 編譯過程分為四個階段進行,即預處理 也稱預編譯,preprocessing 編譯 compilation 彙編 assembly 和連線 linking prepr...

GCC編譯常用命令

加入新公司後,基本上是一鍵式打包指令碼,對於gcc基本上快忘了,重新拾起。gcc命令提供了非常多的命令選項,但並不是所有都要熟悉,初學時掌握幾個常用的就可以了,到後面再慢慢學習其它選項,免得因選項太多而打擊了學習的信心。一.常用編譯命令選項 假設源程式檔名為test.c。1.無選項編譯鏈結 用法 g...

手冊 GCC常用命令

在linux下新建乙個c檔案test.c,可能用到的命令如下 一步到位的編譯命令 得到可執行檔案 gcc test.c o test預處理 gcc e test.c將預處理結果編譯為彙編 gcc s test.i o test.s彙編檔案轉為目標檔案 gcc c test.s o test.o鏈結 ...