动态库使用方法 工作笔记
1: 怎么编译动态库 详细解释下各个参数的意义 动态库和静态库区别
生成共享库: gcc -share -fPIC -o xx.so ff.c
-share : 创建一个共享的目标文件
-fPIC : 指示编译器生成一个与位置无关的代码 使用共享库:
gcc -rdynamic -o app -ldl main.c
-ldl : 使用dl库提供的dlopen 等手动打开动态库 ,如果不手动打开,自然也可以像添加dl 这个库的形式添加需要使用的库
-rdynamic :
2: 如果一个app需要多个动态库和静态库,怎么添加它们?
#####添加多个静态库########
LD_FLAGS += -Wl,-Bstatic -Wl,--start-group \
-lsss \
-lsssss \
-lmd5 \
LD_FLAGS += -Wl,--end-group
########### DYN LIB ###################
LD_FLAGS += -Wl,-Bdynamic lskpm \
-lskshell
注意关键字
-Bstatic -Bdynamic -start-group --end-group
3: 如何查看动态库的依赖关系
在dlopen 打开库的过程中如果出现file no exit 的错误, 要注意查看库的依赖关系
4: 如何使用dlopen 这一系列函数, 在使用的过程中要注意什么?
添加-ldl 库
5: 实例分析
模块sktr069 依赖libevent dl 这两个库。 因为在sktr069 中调用了dlopen 来打开自己, 所以sktr060 必须是以动态库的形式集成到skapp 中, 在生成libsktr069.so 动态库的时候, 用了下面命令
$(CC) -fPIC -shared -o $@ $^
arm-hismall-linux-gcc -fPIC -shared -o libsktr069.so access_list.o accessor.o add_object.o
需要注意的是虽然libstr069.so 这个库中调用了libevent . dl 这两个库,但是在生成动态库的时候却不需要 添加这两个库,
在集成libsktr069.so的时候再链接这两个库就ok了。 其实仔细理解下编译过程,是很好理解的, 《深入理解计算机系统》 第七章上面有很好的解释参考资料http://www.blogjava.net/ThinkingTalking/archive/2010/07/07/325487.html------------------------------------------------------------------------------------------
注: 以上仅仅是在项目中使用到的。 原理等详细看《CSAPP》 第七章