日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux添加自己的库,Linux学习笔记——例叙makefile 增加自定义共享库

發布時間:2025/5/22 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux添加自己的库,Linux学习笔记——例叙makefile 增加自定义共享库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Linux學習筆記——例說makefile 增加自定義共享庫

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包。

【本例說明】

本例分為兩個過程,先制作一個共享庫,然后在使用這個共享庫。共享庫采用動態鏈接方式,后綴為.so。

1.gcc復習

【1】gcc指令中使用共享庫使用前綴-l,共享庫查找目錄使用-L。

【2】一般情況下DLIBS中加入共享庫,而LDFLAGS中加入共享庫查找目錄。

2.共享庫源文件

和生成共享庫有關的文件位于libtest目錄中,在makefile最后把共享庫復制到同級的lib目錄中。具體內容請參考代碼倉庫并復制zip包。

【libtest.h】

指定接口,給出相應聲明

#ifndef __LIBTEST_H

#define __LIBTEST_H

int sub(int a, int b);

int add(int a, int b);

#endif

【test-add.c】

int add(int a, int b)

{

return a+b;

}

【test-sub.c】

int sub(int a, int b)

{

return a-b;

}

3.共享庫的makefile

請替換其中的[tab],并以代碼倉庫中的makefile文件為主。

# 指令編譯器和選項

CC = gcc

CFLAGS = -Wall -std=gnu99

# 目標文件

TARGET = libtest.so

# C文件

SRCS = test-add.c test-sub.c

# 目標文件

OBJS = $(SRCS:.c=.o)

# 鏈接為可執行文件

$(TARGET):$(OBJS)

[tab]$(CC) -shared -o $@ $^

[tab]mv $(TARGET) ../lib

clean:

[tab]rm -rf $(TARGET) $(OBJS)

# 編譯規則 $@代表目標文件 $< 代表第一個依賴文件

%.o:%.c

[tab]$(CC) $(CFLAGS) -o $@ -fPIC -c $<

【說明】

【1】目標為libtest.so,請務必以lib開頭 .so結尾,在使用該共享庫時系統會自動的去除lib和.so,使用時寫成-ltest。

【2】多數內容和學習筆記中的多個文件相同。

【3】在鏈接過程中加入-shared參數,意為共享形式的目標文件。

【4】在編譯過程中加入-fPIC參數,意為生成和地址無關的目標文件。

【5】在鏈接完成之后,通過mv指令把libtest.so移動到同級的lib目錄中。

【6】如果有必要,可以把libtest.so復制到/usr/lib目錄中,這樣使用起來會更加方便。

【驗證】

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)

【編譯和執行】

make clean && make

【控制臺輸出】

rm -rf libtest.so test-add.o test-sub.o

gcc -Wall -std=gnu99 -o test-add.o?-fPIC?-c test-add.c

gcc -Wall -std=gnu99 -o test-sub.o?-fPIC?-c test-sub.c

gcc?-shared?-o libtest.so test-add.o test-sub.o

mv libtest.so ../lib

【1】編譯過程中加入了-fPIC選項。

【2】鏈接過程中加入-shared選項。

【3】共享庫為libtest.so。

【4】最后,共享庫被移動到上一級的lib目錄中。

4.源文件

調用共享庫指定的接口,add和sub函數。

#include

#include

int main(void)

{

int a = 3;

int b = 2;

printf("a=%d\n", a);

printf("b=%d\n", b);

printf("a+b=%d\n", add(a, b));

printf("a-b=%d\n", sub(a, b));

return 0;

}

5.makefile

請替換其中的[tab],并以代碼倉庫中的makefile文件為主。

# 指令編譯器和選項

CC = gcc

CFLAGS = -Wall -std=gnu99

# 目標文件

TARGET = test

# C文件

SRCS = test.c

# 頭文件查找路徑

INC = -I.

# 庫文件和庫查找路徑

DLIBS = -ltest

LDFLAGS = -L./lib

# 指定運行時的庫文件路徑

RPATH = -Wl,-rpath=./lib

# 目標文件

OBJS = $(SRCS:.c=.o)

# 鏈接為可執行文件

$(TARGET):$(OBJS)

[tab]$(CC) -o $@ $^ $(LDFLAGS) $(DLIBS) $(RPATH)

clean:

[tab]rm -rf $(TARGET) $(OBJS)

# 連續動作,請清除再編譯鏈接,最后執行

exec:clean $(TARGET)

[tab]@echo 開始執行

[tab]./$(TARGET)

[tab]@echo 執行結束

# 編譯規則 $@代表目標文件 $< 代表第一個依賴文件

%.o:%.c

[tab]$(CC) $(CFLAGS) $(INC) -o $@ -c $<

6.具體說明

【1】DLIBS =?-ltest?指定共享庫,請注意共享庫的名稱為libtest.so,而-l參數只取test部分,去掉前綴lib和后綴.so。

【2】LDFLAGS = -L./lib 指定共享庫路徑,請注意上一步中已經把共享庫復制到lib目錄中。

【3】INC = -I./lib ?指定libtest.h目錄,也可把libtest.h復制到test.c所在的目錄。

【4】$(CC) -o $@ $^ $(LDFLAGS) $(DLIBS) 鏈接過程指定共享庫查找路徑,指定共享庫名稱。

【5】第【1】和第【2】點只在鏈接過程有效,在執行過程中需要通過-Wl,-rpath=指定共享庫路徑。

【編譯和鏈接】

make clean && make

【控制臺輸出】

rm -rf test test.o

gcc -Wall -std=gnu99 -I./lib -o test.o -c test.c

gcc -o test test.o?-L./lib -ltest -Wl,-rpath=./lib

【執行】

在執行之前還可以通過ldd test查看libtest是否鏈接成功。

./test

a=3

b=2

a+b=5

a-b=1

從控制臺的輸出結果可以看出,共享庫運行正常。

7.總結

【1】-l指定共享庫名稱,-L指定共享庫路徑。

8.參考資料

【1】gcc中的-Wl,rpath=選項

【2】makefile學習經驗(三)----編譯生成動態庫文件(方式一)

總結

以上是生活随笔為你收集整理的linux添加自己的库,Linux学习笔记——例叙makefile 增加自定义共享库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。