perror() 和 dlerror()
来源:互联网 发布:java中的23种设计模式 编辑:程序博客网 时间:2024/06/05 13:29
今天同学问了个问题, 为什么包含了<dlfcn.h> 用dlopen 还提醒未定义
我拿源码来看了下
#include <stdlib.h>#include <dlfcn.h>#include "add.h"#include <stdio.h>typedef int(*P_FUNC)(int,int);int main(){ void *handler = dlopen("libtext.so",RTLD_NOW); P_FUNC add = dlsym(handler,"add"); P_FUNC sub = dlsym(handler,"sub"); //if(!sub) perror("sub dlsym"),exit(-1); P_FUNC mul = dlsym(handler,"mul"); //if(!mul) perror("mul dlsym"),exit(-1); show(30,'+',20); printf("%d\n",add(30,20)); show(30,'-',20); printf("%d\n",sub(30,20)); show(30,'*',20); printf("%d\n",mul(30,20)); dlclose(handler); return 0;}
更改如下
typedef int(*P_FUNC)(int,int);typedef void (*P_SHOW)(int,char,int);//newint main(){ void *handler = dlopen("libtext.so",RTLD_NOW);if(!handler) perror("dlopen"),exit(-1); P_FUNC add = (P_FUNC)dlsym(handler,"add"); if(!add) perror("add dlsym"),exit(-1); P_FUNC sub = (P_FUNC)dlsym(handler,"sub"); if(!sub) perror("sub dlsym"),exit(-1); P_FUNC mul = (P_FUNC)dlsym(handler,"mul"); if(!mul) perror("mul dlsym"),exit(-1); P_SHOW show = (P_SHOW)dlsym(handler,"show");//new //if(!show) perror("show dlsym"),exit(-1); show(30,'+',20); printf("%d\n",add(30,20)); show(30,'-',20); printf("%d\n",sub(30,20)); show(30,'*',20); printf("%d\n",mul(30,20)); dlclose(handler); return 0;}
接下来 继续编译 gcc main.c -ldl 没想到遇到了段错误, 并且终端输出了 dlopen: Success
if (!handler) {printf ("dlopen失败:%s\n",dlerror());return -1;}
编译 结果输出的是
dlopenʧ�ܣ�libtext.so: cannot open shared object file: No such file or directory
打开动态库失败............果断忘了配置环境变量.............但是可以肯定的是 perror() 不能 代替dlerror()功能 ,稍后套路他俩的区别,先导入环境变量
$export LIBRARY_PATH=$LIBRARY_PATH:.$export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
编译 运行 成功.
接下来我去查了 perror() 和 dlerror()的区别.
原来对动态链接库有特定的dlerror函数返回错误信息.
dlerror()
包含头文件:
#include <dlfcn.h>
函数原型:
char *dlerror(void);
函数描述:
当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。 from[百度百科]
perror()
包含头文件:
#include<stdio.h>
#include<stdlib.h>
函数描述:
perror( ) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。
在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。from[百度百科]
0 0
- perror() 和 dlerror()
- dlerror
- perror() 和 strerror()
- perror和strerror
- errno 和perror
- perror 和 strerror 区别
- perror 和 strerror 区别
- perror
- perror
- perror
- perror ( )
- perror
- perror
- perror
- perror
- perror
- perror
- perror
- 做一个开源的飞控板,可移植naze32代码,Crazyflie代码
- 根据T-code查找对应的BAPI
- Java程序实现五子棋小游戏
- org.apache.jasper.JasperException: Unable to compile class for JSP 解决方法
- UVa 11292 - Dragon of Loowater(贪心)
- perror() 和 dlerror()
- uva 10167 - Birthday Cake(最简单枚举)
- SQL中varchar和nvarchar有什么区别?
- vim添加和删除注释
- javafx实现拖人文件到node,将node里面的内容为文件保存
- 黑马程序员------静态方法中为什么不能写this和super?这两者之间的区别是什么呢? Day02
- 常量指针和指针常量
- 统计字符串中连续数字字符组成的整数的个数
- memcache