perror() 和 dlerror()

今天同學問了個問題, 爲什麼包含了<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;

}


首先以上代碼: 明確的錯誤是show() 函數沒有 獲取libtext.so動態庫裏的函數地址,並且所有dlsym 函數前都沒有函數類型的強制轉換.

更改如下

typedef int(*P_FUNC)(int,int);
typedef void (*P_SHOW)(int,char,int);		//new
int 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>
函數原型:
void perror(const char *s)

函數描述:

perror( ) 用來將上一個函數發生錯誤的原因輸出到標準設備(stderr)。參數 s 所指的字符串會先打印出,後面再加上錯誤原因字符串。此錯誤原因依照全局變量errno 的值來決定要輸出的字符串。
在庫函數中有個errno變量,每個errno值對應着以字符串表示的錯誤類型。當你調用"某些"函數出錯時,該函數已經重新設置了errno的值。perror函數只是將你輸入的一些信息和現在的errno所對應的錯誤一起輸出。from[百度百科]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章