程式生成的四個步驟,Linux動態庫與靜態庫

2021-07-24 14:10:43 字數 1479 閱讀 4684

程式生成的四個步驟,linux動態庫與靜態庫

#(個人課堂筆記)

預處理:gcc –e demo.c           只進行預處理

gcc –e demo.c > demo.i    將預處理資訊寫入demo.i  (>表示重定向的意思)

1.標頭檔案展開把#include展開進.c檔案

系統存放頭檔案目錄  根目錄/user/include

#include包含的標頭檔案搜尋路徑是系統的頭檔案目錄,找不到報錯

#include」stdio.h」 包含的標頭檔案搜尋路徑是先在當前.c目錄的下找,再到系統的頭檔案目錄找,找不到報錯(編譯效率低)

2.巨集替換    替換巨集定義的常量#define

3.條件編譯 #if  #endif 可以在編譯的時候把一些**去掉,可

編譯:gcc –c demo.c  生成demo.o編譯檔案 

作用:語法檢查和詞法分析

彙編:gcc –s demo.c  生成demo.s彙編檔案

●gcc 編譯後生成a.out檔案    這是彙編以後的語言,也就是可執行檔案

●arm-linux-gcc demo.c          交叉編譯**:用arm彙編

●file a.out                    顯示組合語言的屬性

●自定義」add.h」使用者標頭檔案 #include」add.h」

路徑不在可執行檔案目錄時:1. 「../add.n」指定標頭檔案路徑(源程式指定標頭檔案路徑,不利於移植)

2.gcc demo.cadd.c –o demo –i/root/1109 編譯時指定第三方搜尋路徑(大寫i)(編譯時指定標頭檔案路徑,有利於移植)

●gcc demo.c add.c –o demo –i/root -dmax  在外部指定巨集變數max(程式內不需要#define)

●linux庫檔案:靜態庫:編譯時就把庫檔案加入程式檔案,字尾名為.a

(執行速度快,**容易部署,編譯耗時,體積大,執行時占用過多記憶體,程式公升級困難)   

動態庫:執行時呼叫庫檔案字尾名為.so

(反之)

只能使用庫檔案的變數和函式,但是無法知道如何實現,例如公司售賣的產品

預設庫檔案目錄:/lib目錄與/user/lib放的都是linux的庫檔案

製作靜態庫

1.gcc –c add.c         生成編譯檔案add.o

2.ar rcs libadd.a.add.o  生成libadd.a庫檔案

3.gcc main.c –ldemo    鏈結add庫(先在系統的庫檔案搜尋) 小寫l

4.gcc main.c –ladd –l/root/1111 指定搜尋庫檔案路徑

5.read me 使用提示

製作動態庫

1.gcc –shared –fpic –o libadd.so add.c     動態庫的建立

2.gcc main.c /root/1111/libadd.so –o add  動態庫的使用

GCC編譯C程式的四個步驟

最近在看ram下的彙編以及優化。順便看了下用gcc編譯的過程。用helloworld.c 來說明問題 1.預編譯 gcc e helloworld.c o helloworld.i 在這一步之後,生成的.i檔案會比你的.c檔案大很多。裡面包含著你的.c中包含的標頭檔案的內容,以及一些預處理 等。必須...

ROS catkin編譯的四個步驟

1.宣告依賴庫。首先,我們需要宣告程式所依賴的其他功能包。為了給出依賴庫,編輯包目錄下的 cmakelists.txt 檔案。該文 件的預設版本含有如下行 find package catkin required 所依賴的其他 catkin 包可以新增到這一行的 components 關鍵字 後面,...

程式執行隱藏的四個步驟你了解嗎?

1.預編譯 處理規則 巨集替換。處理所有條件預編譯指令,比如 if ifdef 等。將 include 展開,把它裡面的 全拷過來。刪除所有的注釋。新增行號和檔案標識,目的是報錯可以定位置。保留所有的 pragma 指令,因為它處理不了,編譯器處理。指令 2.編譯 處理規則 詞法分析 即單詞是否符合...