1、什么是動態庫?
動態庫內部鏈接路徑是相對的,所以修改路徑仍然可以使用,動態庫名字格式 以lib開頭, .so 結尾,格式就是 libxxx.so
動態庫是程序運行時裝入,所以可以不用更換程序,只更換動態庫
2. 怎么編譯自己的動態庫?

g++ -std=c++11 -shared -fPIC p.cpp -o libo.so
/home/hfz/project/T113/T113-i/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++ HRDSP.c -fpic -shared -o libHRDSP.so
??-fpic:生成位置無關代碼,這是動態庫必須的。
??-shared:告訴編譯器生成共享庫
??-o:指定輸出文件名
2.1 將多個源文件編譯成1個動態庫(如果是多個.c文件和.h文件編譯成1個動態庫)
??方法1:單獨編譯每個源文件再合并
????gcc -fPIC -c src/utils.c -Iinclude -o utils.o
????gcc -fPIC -c src/math.c -Iinclude -o math.o
??????-Iinclude:指定頭文件搜索路徑
??????-c:只編譯不鏈接
??????-fPIC:生成位置無關代碼
????gcc -shared -o libmylib.so utils.o math.o
??方法2:直接編譯所有源文件:
????gcc -fPIC -shared src/utils.c src/math.c -Iinclude -o libmylib.so
??方法3:對于大型項目,推薦使用Makefile
2.2怎么使用動態庫編譯自己的程序?
?/home/hfz/project/T113/T113-i/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++ tld_system_info.c -L. libsdk_HRDSP.so
****/arm-linux-gnueabi-g++??是交叉編譯期
tld_system_info.c ?????? 是demo程序
-L. ????????????? L 表示需要調用動態庫, . 表示動態庫路徑
libsdk_HRDSP.so ?????? 表示動態庫名
/home/hfz/project/T113/T113-i/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++ HRDSP.c -fpic -shared -o libHRDSP.so
??-fpic:生成位置無關代碼,這是動態庫必須的。
??-shared:告訴編譯器生成共享庫
??-o:指定輸出文件名
2.1 將多個源文件編譯成1個動態庫(如果是多個.c文件和.h文件編譯成1個動態庫)
??方法1:單獨編譯每個源文件再合并
????gcc -fPIC -c src/utils.c -Iinclude -o utils.o
????gcc -fPIC -c src/math.c -Iinclude -o math.o
??????-Iinclude:指定頭文件搜索路徑
??????-c:只編譯不鏈接
??????-fPIC:生成位置無關代碼
????gcc -shared -o libmylib.so utils.o math.o
??方法2:直接編譯所有源文件:
????gcc -fPIC -shared src/utils.c src/math.c -Iinclude -o libmylib.so
??方法3:對于大型項目,推薦使用Makefile
CC = gcc
CFLAGS = -fPIC -Wall -Iinclude
LDFLAGS = -shared
TARGET = libmylib.so
SOURCES = $(wildcard src/*.c)
OBJECTS = $(SOURCES:.c=.o)
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(LDFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f src/*.o $(TARGET)
.PHONY: all clean
2.2怎么使用動態庫編譯自己的程序?
?/home/hfz/project/T113/T113-i/out/toolchain/gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++ tld_system_info.c -L. libsdk_HRDSP.so
****/arm-linux-gnueabi-g++??是交叉編譯期
tld_system_info.c ?????? 是demo程序
-L. ????????????? L 表示需要調用動態庫, . 表示動態庫路徑
libsdk_HRDSP.so ?????? 表示動態庫名
3.兩種方法生成動態庫
方法一:直接用.c .cpp創建動態鏈接庫

這樣 libmyfunction.so 就包含了兩個.o文件?(好像是這樣)
方法二:先用 .c .cpp生成 .o , 再用 .o 創建動態鏈接庫,或者直接用現成的.o 生成動態鏈接庫

4、實例展示
??

??

??$(LIBS) 其實就是 .o 文件,$^ 是所有依賴集合,也就是 $(objs),也是一些 .o 文件,但是這里不單單只有變量 $(objs) 包含的 .o文件,也有一些已經鏈接好的
??靜態庫或動態庫(這里就是 $(LIBS) )中的 .o 文件需要用到,所以這里加上了。
??$(FULL_SUFFIX) 是組裝的動態庫版本,這里是 .1.0.15 那么最后組裝的就會是 libxxx.so.1.0.15
??$(SHORT_SUFFIX) 其實就是 .1
??@echo 就是打印信息
??
??$(LD) 就是 aarch64-himix200-linux-gcc
??$(LDFLAGS) 這里只添加了一個參數 -fPIC,并沒有添加什么庫;
??-shared -fPIC 是創建動態庫很重要的兩個參數,
??$(LN) 是創建的兩個軟連接,指向生成的動態庫,這里為什么要創建軟連接,我也不知道;
浙公網安備 33010602011771號