动态库
来源:互联网 发布:云计算 政策 编辑:程序博客网 时间:2024/06/05 10:00
动态库创建:
动态库基本常识:
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);
阅读全文
0 0
- 动态加载动态库
- 动态加载动态库
- 动态库
- 动态库
- 动态库
- 动态库
- 动态库
- 动态库
- 动态库
- 动态库
- 动态库
- linux 动态加载动态库
- linux 动态加载动态库
- CodeBlocks加载动态动态库
- 动态调用C++动态库
- Qt动态加载动态库
- linux 动态加载动态库
- Delphi动态调试动态库步骤
- 基于深度学习的目标检测研究进展
- Eclipse 构建Maven项目详细流程(图文并茂)
- XGBOOST整理
- 设计模式(三)
- 数据库总结(一)
- 动态库
- bzoj 4997: [Usaco2017 Feb]Why Did the Cow Cross the Road III
- #Deep Learning回顾#之基于深度学习的目标检测
- Android小项目————聊天室(网络编程篇)
- 周末训练笔记
- mac上终端命令行下载东西
- ubuntu 16.04 MySQL 5.7 忘记密码
- 网关ip
- maven远程仓库和本地仓库配置