linux动态库.ppt
文本预览下载声明
目的: 共享文件 节省空间 提高效率 采用动态库可以有效的减少程序大小 增加程序的可扩展性,便于模块化管理 生成过程 编写源程序 编译成.so文件 编写.makefile文件 定位动态库 Makefile: 基本框架: 目标:所依赖的文件 Tab 规则 Make 主要预定义的变量 $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。 $ 第一个依赖文件的名称。 $? 所有的依赖文件,以空格分开,这些依赖文件的修改日期比目标的创建日期晚。 $* 不包含扩展名的目标文件名称。 $@ 目标的完整名称。 $^ 所有的依赖文件,以空格分开,不包含重复的依赖文件。 $% 如果目标是归档成员,则该变量表示目标的归档成员名称。 使用 在源程序中使用 在编译时加载相应的动态库 动态库函数 void *dlopen(const char *filename, int flag); const char *dlerror(void); void *dlsym(void *handle, char *symbol); int dlclose(void *handle); 说明: 动态库函数 dlopen 将共享目标文件打开并且映射到内存中,并且返回句柄 dlsym 返回一个指向被请求入口点的指针 dlerror 返回 NULL 或者一个指向描述最近错误的 ASCII 字符串的指针 dlclose 关闭句柄并且取消共享目标文件的映射 使用 与windows dll 的区别: (1)动态库程序编写,在Windows系统下的执行文件格式是PE格式,动态库需要一个DllMain函数作为初始化的人口,通常在导出函数的声明时需要有_declspec(dllexport)关键字。Linux下的gcc编译的执行文件默认是ELF格式,不需要初始化入口,亦不需要到函数做特别声明,编写比较方便。 (2)动态库编译,在windows系统下面,有方便的调试编译环境,通常不用自己去编写makefile文件,但在linux下面,需要自己动手去编写makefile文件,因此,必须掌握一定的makefile编写技巧,另外,通常Linux编译规则相对严格。 与windows dll 的区别 (3)动态库调用方面,Windows和Linux对其下编制的动态库都可以采用显式调用或隐式调用,但具体的调用方式也不尽相同。 (4)对操作系统的依赖,这两种动态库运行依赖于各自的操作系统,不能跨平台使用。因此,对于实现相同功能的动态库,必须为两种不同的操作系统提供不同的动态库版本。 动态库如何共享 (1)拷贝动态链接库到系统共享目录下,或在系统共享目录下为该动态链接库建立个连接(硬连接或符号连接均可,常用符号连接). (2)将动态链接库所在目录名追加到动态链接库配置文件/etc/ld.so.conf中. (3)利用动态链接库管理命令ldconfig,强制其搜索指定目录,并更新缓存文件,便于动态装入. 结束 谢谢大家 * * Linux共享库的生成与应用 刘飞欧 *
显示全部