动态库





动态库创建:


动态库基本常识:


1. win环境下,动态库—— xxx.dll  xxx.lib  xxx.h


Linux环境下,动态库—— xxx.so   xxx.h   -L  -l   动态链接器  LD_LIBRARY_PATH    ldd keymngserver  ====> not found


链接器: 工作于 可执行文件 编译期间。  -L  -l 给链接器指定 路径和文件名。


动态链接器: 工作与 可以行文件 运行期间。 


2. 动态库不是一个exe。是系列函数的集合(二进制)。   keyMsg_Encode.c


按某种规范制作,被操作系统加载。  VS -- ldd 


如: 111.exe  --- aaa.dll    


系统在加载111.exe时,检查111.exe运行是否需要额外的动态库。

若需要,则按一定规则加载。找到成功加载,找不到。报错。----指定动态库路径




——————————windows 动态库


动态库的制作:


动态库的命名,不要使用中文。 


创建时选择.dll生成项目。  但,不能运行。




动态库API函数的 导出。  


只将用户使用的指定某几个函数从动态库中导出。   --- xxx.lib


使用 __declspec(dllexport) 宏,提示编译器。在编译程序的时候,需特殊处理的函数。


注意: .c 文件 和 .h 文件 均需要添加该宏!!


默认生成的动态库位于上层目录下的 Debug 目录内。






动态库制作结果:


xxxxx.dll 二进制目标函数集,可被操作系统加载


xxxxx.lib 是对dll的描述文件 (包含多少函数,哪些被导出。。。。)


xxx.h 以及以上2个文件 即可为exe执行提供支持。 但提供给用户时, .h中的 __declspec(dllexport) 宏应删除。






动态库调用和调试:


通知VS2013编译器,使用提供的动态库。


将.dll .lib .h三个文件放置在 .c同级目录下。


右键项目“属性”---“配置属性”---“链接器”---“输入”--- “附加依赖项”---下拉菜单“编辑”


----输入【描述dll信息lib文件  xxxxx.lib】       


常见错误:


1. 若xxx.lib配置错误,则VS编译器无法找到所用函数。 


2. 如若在运行111.exe时,说明操作系统找不到动态库加载路径。 


1. 配置PATH  2. 将exe和动态库dll置于同一目录下即可。


VS2015:


xxxx.lib  ---> .c 源码 .h 头文件所在目录位置


xxxx.dll ---> .exe 可执行文件所在目录位置。


动态库内存释放:


遵循一个原则:谁分配,谁释放。


   调用动态库函数分配的内存,也一定要调用动态库函数来释放内存。




__declspec(dllexport) 宏的使用:


1. 制作 dll库的时候: .c 和 .h 都添加。


2. 使用 dll 库的是: .h 中 不添加。



——————————Linux 动态库制作




lib库名.so  xxx.h




1. 制作 Linux 动态库


1. gcc  -c itcast_asn1_der.c  -o itcast_asn1_der.o  -fPIC  (生成与位置无关的代码)       ./a.out  运行之后  加载。  延迟载入。


    -c itcastderlog.c 

    -c keymng_msg.c 


链接: 数据段合并 和 地址回填(数据地址重定位) main + xxxxx




ar 制作静态库。


2. gcc -shared  -o lib库名.so  itcast_asn1_der.o itcastderlog.o keymng_msg.o  ---->   lib库名.so 




2. 动态库使用:


lib库名.so  文件 本身不能执行。  xxxx.dll  


项目目录/ src/  -- xxx.c


obj/  -- xxx.o   用于调试


inc/  -- xxx.h 头文件


lib/  -- xxx.so/xxx.a  库


media/ -- 媒体文件


makefile   


gcc test.c -o a.out -L 指定库所在路径 -l 指定库名(去掉lib, 去掉.so) -I 指定库所对应的头文件所在目录   ---> a.out  --> ./a.out



链接器: 工作于连接生成可执行文件阶段。 gcc 第 4 步。 任务:数据段合并 和 地址回填(数据地址重定位)


用 -L  -l  -I 参数。


动态链接器: 工作于 加载器加载可执行文件到内存后,程序运行时查找库函数期间。   加载库函数到内存,重定位函数地址。(绝对地址)


用 LD_LIBRARY_PATH 。  ldd  ./a.out  ===> not found




运行 : ./a.out   ----》  报错!  --》  原因:  动态连接器,找不到加载动态库的目录位置。    ldd  a.out    找不到:  ===> not found


错误提示:./a.out: error while loading shared libraries: libmymessagereal.so: cannot open shared object file: No such file or directory

    -l、-L 给 “连接器” 指定动态库所在位置。


解决: 1. 将自定义的动态库 cp 放到 标准C库 ( libc ) 所在目录位置;(不推荐)


2. 在可执行文件所在目录位置 执行命令: export LD_LIBRARY_PATH = 库路径; (临时生效)


3. 帮助动态连接器 指定加载 动态库目录位置。 export LD_LIBRARY_PATH = 库路径; 写入 ~/.bash_profile 中


4. ...


5. ...   APUE




ldd a.out 成功显示动态库位置。    ./a.out 运行。












===================================================




makefile :




gcc -c itcast_asn1_der.c -o itcast_asn1_der.o 预处理、编译、汇编


gcc -c itcastderlog.c -o itcastderlog.o 预处理、编译、汇编


gcc -c keymng_msg.c -o keymng_msg.o 预处理、编译、汇编


gcc -c keymng_msg_test.c -o keymng_msg_test.o 预处理、编译、汇编


gcc itcast_asn1_der.o itcastderlog.o keymng_msg.o keymng_msg_test.o -o a.out 链接




1 条规则:


目标:依赖


命令

要求,目标必须晚于依赖条件生成时间。如果不满足,则更新目标。


   如果依赖不存在,寻找新的规则生成依赖。


2 个函数:


$(wildcard 参): 获取指定类型特征的文件、


src = $(wildcard *.c) 


$(patsubst 参1, 参2, 参3):根据执行类型变量,获取新变量。


$(patsubst %.c, %, $(src)): 将参数3 中,包含参数1的部分,替换成参数2。

3 个自动变量:


$@: 在规则的 命令中, 表示目标。


$^: 在规则的 命令中, 表示 所有依赖条件


$<: 在规则的 命令中, 表示 第一个依赖条。 如果是模式规则,会将依赖条件依次取出。 执行命令。




%.o: %.c
gcc -c $< -o $@


静态模式规则:


指定,针对某一个变量,使用特定的模式规则。


==========================================================================================================================================


统一通信:


连接池 初始化


int sockPool_init(int num, int ip, int port, void **handler);


获取一条连接:


int sockPool_get(void *handler, int *fd);


读取数据


int sockPool_recv(int fd, unsigned char **out, int *outLen);


发送数据


int sockPool_send(int fd, unsigned char *in, int inLen);


放回一条连接:


int sockPool_put(void *handler, int fd);




连接池 销毁


int sockPool_destroy(void *handler);




































































你可能感兴趣的:(动态库)