Linux學習筆記——例說makefile 增加系統共享庫

xukai871105發表於2014-07-05
0.前言
    從學習C語言開始就慢慢開始接觸makefile,查閱了很多的makefile的資料但總感覺沒有真正掌握makefile,如果自己動手寫一個makefile總覺得非常吃力。所以特意藉助部落格總結makefile的相關知識,通過例子說明makefile的具體用法。
    例說makefile分為以下幾個部分,更多內容請參考【例說makefile索引博文
    1.只有單個C檔案   
    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
    【編譯和連結】
    make clean && make
    【控制檯輸出】
rm -rf test test.o
gcc -Wall -std=gnu99 -o test.o -c test.c
gcc -o test test.o -lm
    從控制檯輸出可以看出,在連結過程中加入了庫檔案。
    【執行】
./test
sin(30.00)=0.50
    執行結果正常,符合預期效果。

6.總結
    【1】增加系統共享庫時使用字首-l。
    【2】系統共享庫不需要指定路徑。
    


相關文章