Linux下靜態庫的生成以及使用例項圖解
首先介紹一些gcc常用的選項:
作用 |
|
-o |
產生目標(.i、.s、.o、可執行檔案等) |
-c |
通知gcc取消連結步驟,即編譯原始碼並在最後生成目標檔案 |
-E |
只執行C預編譯器 |
-S |
告訴編譯器產生組合語言檔案後停止編譯,產生的組合語言副檔名為.s |
-Wall |
使gcc對原始檔的程式碼有問題的地方發出警告 |
-Idir |
將dir目錄加入搜尋標頭檔案的目錄路徑 |
-Ldir |
將dir目錄加入搜尋庫的目錄路徑 |
-llib |
連結lib庫 |
-g |
在目標檔案中嵌入除錯資訊,以便gdb之類的除錯程式除錯 |
靜態庫(.a):程式在編譯連結的時候把庫的程式碼連結到可執行檔案中。程式執行的時候將不再需要靜態庫;
靜態庫的生成:用myprint.h 和 myprint.c 生成靜態庫libmyprint.a,然後用main.c使用該靜態庫;
myprint.h
void myprint(int num);
myprint.c
#include <stdio.h>
void myprint(int num)
{
printf("my num is %d\n", num);
}
main.c
#include<stdio.h>
#include "myprint.h"
int main()
{
myprint(100);
myprint(1000);
return 0;
}
第一步:生成myprint.o檔案;使用命令,gcc -c myprint.c -o myprint.o
第二步:將生成的myprint.o檔案打包成靜態庫myprint.a檔案;使用命令 ar rcs libmyprint.a myprint.o
可以使用命令file 檔案檢視檔案型別;使用命令nm 檢視靜態庫中的函式名稱;
此時已經生成了靜態檔案libmyprint,可以將myprint.c檔案刪除;myprint.o也沒有用了,也刪除;
第三步:使用生成的靜態庫;
如果直接輸入命令gcc main.c -o main 會提示錯誤,沒有連結靜態庫,所以會報錯
用-l來連結靜態庫;輸入命令gcc main.c -o main -lmyprint 結果還是報錯,沒有找到該庫檔案,應該指定庫檔案的路徑;
用-L來指定當前路徑;輸入命令gcc main.c -o main -lmyprint -L.;執行成功,生成了可執行檔案main,執行main正常;
如果我把myprint.h放在inc目錄下,把myprint.c, main.c放在src目錄下;將生成的靜態庫libmyprint.a放在lib目錄下;將生成的可執行檔案main放在bin目錄下;
第一步:生成myprint.o檔案到lib目錄下;
第二步:生成myprint.a靜態庫檔案到lib目錄下;
此時myprint.c和myprint.o已經沒有用了;
第三步:使用靜態庫生成可執行檔案main到目錄bin下;注意需要用-I指定標頭檔案目錄
相關文章
- Linux系統下Qt動態庫的生成已經動態庫的使用例項圖解LinuxQT圖解
- Linux下靜態庫生成指南Linux
- linux靜態庫的生成與使用(轉)Linux
- Linux下建立靜態庫、動態庫以及簡單的makefileLinux
- Linux 靜態庫生成指南Linux
- 靜態方法和例項方法的區別以及如何恰當使用
- Linux 靜態庫生成及呼叫Linux
- linux下的靜態庫與動態庫Linux
- 靜態庫生成
- 【例項】使用GD庫生成圖片驗證碼
- Linux下的共享庫(動態庫)和靜態庫Linux
- 簡述Linux下的靜態庫和動態庫Linux
- Linux下快速靜態編譯Qt以及Qt動態/靜態版本共存Linux編譯QT
- Linux 動態庫與靜態庫製作及使用詳解Linux
- Linux下的靜態庫、動態庫和動態載入庫Linux
- Linux共享庫、靜態庫、動態庫詳解Linux
- cmake:生成靜態庫和動態庫
- Linux 依賴動態庫 / 靜態庫的動態態庫 / 靜態庫Linux
- 靜態庫和動態庫的製作以及Bundle資原始檔的使用
- WPF中輕鬆生成動態圖表:例項詳解(MVVM模式)MVVM模式
- Linux環境下建立靜態庫和動態庫Linux
- Linux 中的靜態庫和動態庫簡介及生成過程示例Linux
- 從例項出發,瞭解單例模式和靜態塊單例模式
- javascript 靜態方法和例項方法例項JavaScript
- 靜態頁面佈局例項
- .NET偽靜態使用以及和純靜態的區別
- 封裝動態庫dll與靜態庫lib(原理及簡單例項)封裝單例
- linux下靜態庫、動態庫編譯及makefile書寫Linux編譯
- 你真的瞭解靜態方法與例項方法的區別麼?
- 1.9 靜態頁面佈局例項
- 動態圖解&例項 ConstraintLayout Chain圖解AI
- Linux下把靜態庫編譯進PHP的方法Linux編譯PHP
- js--Object的靜態方法和例項方法JSObject
- android下java的靜態庫和動態庫AndroidJava
- VS下生成與配置靜態庫與動態庫(一)
- linux 靜態地址配置選項Linux
- linux下靜態連結庫和動態連結庫的區別有哪些Linux
- C靜態庫的建立與使用--為什麼要引入靜態庫?