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) 是创建的两个软连接,指向生成的动态库,这里为什么要创建软连接,我也不知道;