Linux动态链接库的使用(通用链表为例)
发布日期:2021-05-26 20:05:08
浏览次数:13
分类:技术文章
本文共 3534 字,大约阅读时间需要 11 分钟。
首先我们必须得知道动态链接库没有main函数,通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。下面演示下:
首先是list.h 文件
#ifndef _LIST_H_#define _LIST_H_#include接下来是list.c文件typedef struct _node_s{ void * pdata; //头检点的数据域 struct _node_s *pnext;}NODE_T,*pNode;pNode list_init(void *data);void list_add(pNode pHead,void *data);int list_del(pNode pHead,int iIndex );pNode list_getNode(pNode pHead,int index);void* list_getNodeData(pNode pHead,int index);int list_count(pNode pHead);#endif
#include "list.h"pNode list_init(void *data){ pNode pHead = NULL; //1.申请一个节点 pHead = malloc(sizeof(pNode)); if(NULL == pHead) { printf("malloc faild! \n"); getchar();// exit(-1); //程序退出 } //2.初始化节点信息 //memset(pHead,0,sizeof(pNode)); pHead->pdata = data; pHead->pnext = NULL; return (pHead);}void list_add(pNode pHead,void *data){ pNode pNew = list_init(data); if(pHead->pnext==NULL) { pHead->pnext=pNew; } else { while(pHead->pnext!=NULL) { pHead=pHead->pnext; } pHead->pnext=pNew; }} int list_del(pNode pHead,int iIndex ){ pNode p = pHead->pnext,p1 = pHead; //p1下一个结点永远是p int count = 0; //用来计结点 //直到结点为空时结束循环 while(p != NULL) { count++; //1.一遍遍历过去找到iIndex if(count == iIndex) { //2.重新串接借调 p1->pnext = p->pnext; //3.释放内存空间 free(p->pdata); //释放p的data free(p); //释放完p的data还有p return 1; //释放成功 } p1 = p1->pnext; p = p->pnext; } return -1; //删除失败}pNode list_getNode(pNode pHead,int index){ int count = 1; pNode pTemp = pHead->pnext;//从下一个节点开始查找 while(pTemp != NULL) //找到该节点 { if(index == count) { return pTemp; } pTemp = pTemp->pnext;//指向下一个节点 count++;//节点序号++ } return pTemp; //没找到返回NULL}void* list_getNodeData(pNode pHead,int index){ int count = 1; pNode pTemp = pHead->pnext;//从下一个节点开始查找 while(pTemp != NULL) //找到该节点 { if(index == count) { return pTemp->pdata; } pTemp = pTemp->pnext;//指向下一个节点 count++;//节点序号++ } return NULL; //没找到返回NULL}int list_count(pNode pHead) //pHead是局部变量参数,和外面没有关系{ int count = 0; while(pHead != NULL) { pHead= pHead->pnext; count++; } return count;}编译生产libcac.so文件如下: gcc -shared -fPIC list.c -o liblist.so
下面是test.c文件
#include#include "list.h"typedef struct student{ int id; char name[20];}S;int main(){ pNode p; p = (pNode )LIST_Init(NULL); S *people = NULL; S *people1 = NULL; S *people3 =NULL; people = (S *)malloc(sizeof(S)); people->id = 1; strcpy(people->name,"gao"); people1 = (S *)malloc(sizeof(S)); people1->id = 2; strcpy(people1->name,"chen"); people3 = (S *)malloc(sizeof(S)); people3->id = 3; strcpy(people3->name,"chen"); LIST_Add(people,p); LIST_Add(people1,p); LIST_Add(people3,p); while(p->pnext!=NULL) { p = p->pnext; S *s =(S*)(p->pdata); printf("id:%d ",s->id); printf("name:%s\n",s->name); } }
编译生产可执行文件main如下:gcc test.c -o test -L ./ -llist (其中-L指明动态链接库的路径,-l后是链接库的名称,省略lib)
执行前必须设置环境变量:输入export LD_LIBRARY_PATH="./$LD_LIBRARY_PATH"
最后执行文件:./test
程序执行结果如下所示:
转载地址:https://blog.csdn.net/Gaodes/article/details/81875537 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月03日 00时20分14秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
上手Pandas,带你玩转数据(6)-- 摆脱对pandas可视化丑图的刻板印象吧
2021-06-30
linux shell — 6.初识 EXT2 文件系统
2021-06-30
Java — String(字符串)
2021-06-30
linux shell — 7.linux 磁盘与文件系统管理
2021-06-30
linux shell — 8.linux 磁盘与文件系统管理(2)
2021-06-30
Java — 事件监听、事件处理 初体验
2021-06-30
linux — Centos 7(第一天) 使用时出现的问题及解决方法
2021-06-30
数据结构 — 图的概述
2021-06-30
Centos 7 上 Eclipse 无法输入中文解决方法
2021-06-30
数据结构 — 图之邻接表存储创建和深度优先遍历
2021-06-30
Centos 7 — Gedit 配色方案
2021-06-30
数据结构 — 图 之 广度优先遍历
2021-06-30
数据结构 — 图 之 MST(最小生成树 — prim算法 )
2021-06-30
数据结构 — 图 之 MPT(最短路径 — dijkstra算法 )
2021-06-30
数据结构 — 7.有向图的创建及出入度的计算
2021-06-30
数据结构 — 图 之 拓扑排序 (AOV网)
2021-06-30
数据结构 — 图 之 关键路径、关键活动 (文字表述)
2021-06-30