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 靜態庫生成及呼叫Linux
- 靜態方法和例項方法的區別以及如何恰當使用
- linux下的靜態庫與動態庫Linux
- 【例項】使用GD庫生成圖片驗證碼
- 例項 靜態 類
- 簡述Linux下的靜態庫和動態庫Linux
- 靜態庫生成
- Linux共享庫、靜態庫、動態庫詳解Linux
- Linux下快速靜態編譯Qt以及Qt動態/靜態版本共存Linux編譯QT
- cmake:生成靜態庫和動態庫
- WPF中輕鬆生成動態圖表:例項詳解(MVVM模式)MVVM模式
- 從例項出發,瞭解單例模式和靜態塊單例模式
- 封裝動態庫dll與靜態庫lib(原理及簡單例項)封裝單例
- 靜態庫和動態庫的製作以及Bundle資原始檔的使用
- 靜態頁面佈局例項
- [Linux]動靜態庫Linux
- 3.4.4 檢視例項的靜默狀態
- linux 靜態地址配置選項Linux
- 你真的瞭解靜態方法與例項方法的區別麼?
- 1.9 靜態頁面佈局例項
- android下java的靜態庫和動態庫AndroidJava
- linux下靜態連結庫和動態連結庫的區別有哪些Linux
- 基於SEH的靜態反除錯(例項分析)除錯
- linux 動態庫 靜態庫 函式覆蓋Linux函式
- Composer 使用 JWT 生成 TOKEN 例項JWT
- C靜態庫的建立與使用--為什麼要引入靜態庫?
- 靜態工廠方法和例項工廠方法
- TypeScript 中 class 的例項成員與靜態成員TypeScript
- Linux 中 ss 命令的使用例項Linux
- Linux 中的 JQ 命令使用例項Linux
- Linux中ip命令的使用例項Linux
- Linux中的basename命令使用例項Linux
- Linux下安裝 Docker例項LinuxDocker
- Linux環境下:程式的連結, 裝載和庫[靜態連結]Linux
- Linux中printf命令使用例項Linux
- phpqrcode生成動態二維碼簡單例項PHP單例
- 在AndroidStudio下使用cmake編譯出靜態連結庫的方法Android編譯
- 動態庫的生成和使用(二)
- iOS - 靜態庫.a 和 framework 詳解iOSFramework