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 增加自定义共享库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用linux运行sublime,在Dee
- 下一篇: 引导扇区维护工具linux,BOOTIC