1.編譯原理
2.下面我們去linux系統去練習編譯的4個流程
演示如下:
當前目錄創建一個c文件,并且查看內容
預處理
并且通過ls命令查看當前文件目錄,發現生成i文件
編譯
生成s文件也就是匯編文件
匯編
生成目標文件,也就是o文件
鏈接
生成可執行文件test
執行這個文件
發現成功執行了我們的代碼
事實上我們也可以通過gcc命令直接講.c文件直接生成可執行文件
首先我們先講生成的目標文件刪除
然后直接將c文件直接生成可執行文件
發現,同樣可以生成可執行文件test
執行
同樣,我們的源代碼被執行了
3.靜態庫
4.動態庫
5.接下來我們去lunix系統中操作一下如何編譯和生成靜態庫和動態庫
(1)靜態庫
首先在當前目錄創建3個文件如下
分別查看3個文件的內容
將tool.c生成目標文件
生成目標文件gcc命令如果省略-o tool.o,默認生成一個和tool同名的o文件
由tool.o文件生成靜態庫文件
發現生成了一個libtool.a的文件
接下來,需要編譯可執行文件,鏈接靜態庫
執行main
使用ls lh來查看詳情
可以發現libtool.a只有1.5k而main卻有8.4k
為什么會多出來這么多呢
可以使用ldd main來查看可執行文件依賴了哪些庫
以上就是如何標準靜態庫和使用靜態庫的過程
(2)動態庫
同上先將tool.c編譯成目標文件tool.o
前面我們已經生成了,這里我們就不在生成了
接下來將.o文件生成動態庫
接下來我們來編譯可執行文件,和鏈接到動態庫
這里和前面靜態庫一樣
那么問題來了,靜態庫和動態庫同名怎么辦?
答:當靜態庫和動態庫同名的時候,gcc會優先加載動態庫
執行main發現報錯了
執行ldd main
執行之前需要設置環境變量
該環境變量主要用于查找共享庫
也就是動態鏈接庫時,除了默認路徑以外的其他路徑
我們的動態so庫沒有在默認路徑,而是在當前路徑一下,所以出現庫找不到,所以我們需要設置環境變量