Linux學習筆記——例說makefile 增加系統共享庫
0.前言
1.只有單個C檔案
從學習C語言開始就慢慢開始接觸makefile,查閱了很多的makefile的資料但總感覺沒有真正掌握makefile,如果自己動手寫一個makefile總覺得非常吃力。所以特意藉助部落格總結makefile的相關知識,通過例子說明makefile的具體用法。
例說makefile分為以下幾個部分,更多內容請參考【例說makefile索引博文】
2.含有多個C檔案
3.需要包括標頭檔案路徑
4.增加巨集定義
5.增加系統共享庫
6.增加自定義共享庫
7.一個實際的例子
【程式碼倉庫】——makefile-example
程式碼倉庫位於bitbucket,可藉助TortoiseHg(GUI工具)克隆程式碼或者在網頁中直接下載zip包。
【本例說明】
本例將說明如何再makefile檔案中增加共享庫。
1.gcc複習
增加共享庫使用-l字首,請注意此處必須要小寫。
【1】一定情況下,系統預設的搜尋庫目錄位於 /usr/lib 和 lib
【2】若共享庫不在系統預設庫中,可通過-L引數指定目錄。請注意該引數只有在連結過程有效。
2.原始檔
原始檔非常簡單,列印sin(30)的結果。由於使用math庫所以需要引入m.a共享庫。
請注意,sin函式和cos函式使用弧度制;傳入的引數為double型別,printf時需要使用lf字首。
#include <stdio.h>
#include <math.h>
#define PI 3.14159265
int main(void)
{
double angle = 30.00 ;
printf("sin(%.2lf)=%.2lf\n", angle, sin(angle * PI / 180));
return 0;
}
3.makefile
請替換其中的[tab],並以程式碼倉庫中的makefile檔案為主
# 指令編譯器和選項
CC = gcc
CFLAGS = -Wall -std=gnu99
# 可執行檔案
TARGET=test
# C檔案
SRCS = test.c
# 目標檔案
OBJS = $(SRCS:.c=.o)
# 庫檔案
DLIBS = -lm
# 連結為可執行檔案
$(TARGET):$(OBJS)
# @echo TARGET:$@
# @echo OBJECTS:$^
[tab]$(CC) -o $@ $^ $(DLIBS)
clean:
[tab]rm -rf $(TARGET) $(OBJS)
# 連續動作,請清除再編譯連結,最後執行
exec:clean $(TARGET)
[tab]@echo 開始執行
[tab]./$(TARGET)
[tab]@echo 執行結束
# 編譯規則 $@代表目標檔案 $< 代表第一個依賴檔案
%.o:%.c
[tab]$(CC) $(CFLAGS) -o $@ -c $<
4.具體說明
【1】DLIBS = -lm 增加共享庫。請注意實際的庫全名為libm.so。
【2】$(CC) -o $@ $^ $(DLIBS) 編譯時增加共享庫。請注意,共享庫增加在連結過程即可,不需要在編譯過程中增加。
【3】由於libm.so為系統庫,所以並不需要指定路徑。linux系統中共享庫的預設查詢路徑為/lib和/usr/lib
5.執行過程
【驗證】
ldd test
linux-vdso.so.1 => (0x00007fffde960000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ffe55b18000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffe55750000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffe55e38000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ffe55b18000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffe55750000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffe55e38000)
從控制檯的輸出可以看出,成功連結了系統共享庫 libm.so
【編譯和連結】
make clean && make
【控制檯輸出】
rm -rf test test.o
gcc -Wall -std=gnu99 -o test.o -c test.c
gcc -o test test.o -lm
gcc -Wall -std=gnu99 -o test.o -c test.c
gcc -o test test.o -lm
從控制檯輸出可以看出,在連結過程中加入了庫檔案。
【執行】
./test
sin(30.00)=0.50
sin(30.00)=0.50
執行結果正常,符合預期效果。
6.總結
【1】增加系統共享庫時使用字首-l。
【2】系統共享庫不需要指定路徑。
相關文章
- Linux學習筆記——例說makefile 多個檔案Linux筆記
- Linux學習筆記——例說makefile 單個C檔案Linux筆記
- Linux學習筆記——例說makefile 標頭檔案查詢路徑Linux筆記
- Makefile學習筆記筆記
- Makefile例項學習
- 嵌入式之Makefile學習筆記筆記
- MakeFile 學習筆記一 核心內容筆記
- Linux系統與安全學習筆記(轉)Linux筆記
- Linux下的makefile編寫 ——陳皓《跟我一起寫Makefile》學習筆記(二)Linux筆記
- 《Linux系統free命令的使用》學習筆記Linux筆記
- 分散式系統學習筆記分散式筆記
- 作業系統學習筆記作業系統筆記
- linux磁碟和檔案系統的學習筆記Linux筆記
- Makefile筆記筆記
- OS學習筆記七:IO系統筆記
- C、作業系統學習筆記作業系統筆記
- 系統程式設計學習筆記程式設計筆記
- 學習筆記 作業系統Linux-Ubuntu 之初次新增系統呼叫筆記作業系統LinuxUbuntu
- mysql增加列,刪除列學習筆記MySql筆記
- 說區塊鏈-學習筆記區塊鏈筆記
- Linux學習筆記Linux筆記
- Linux 學習筆記Linux筆記
- 共享記憶體對映(linux程式與執行緒學習筆記)記憶體Linux執行緒筆記
- boost庫學習筆記筆記
- Mpmath庫-學習筆記筆記
- Linux系統中對中斷的處理(學習筆記)Linux筆記
- makefile筆記(2)筆記
- OS學習筆記六:檔案系統筆記
- ClickHouse學習系列之五【系統庫system說明】
- 作業系統——記憶體管理學習筆記作業系統記憶體筆記
- linux學習筆記8-linux系統io開發知識setsLinux筆記
- 嵌入式系統開發:基於Linux學習筆記整理Linux筆記
- Linux 學習筆記--程式Linux筆記
- linux學習筆記一Linux筆記
- linux學習筆記二Linux筆記
- Linux學習筆記--viLinux筆記
- linux c 學習筆記Linux筆記
- Linux學習筆記1Linux筆記