日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux dlopen 内存,Linux下加载库的有关问题(dlopenm, dlsym)

發(fā)布時間:2025/3/8 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux dlopen 内存,Linux下加载库的有关问题(dlopenm, dlsym) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Linux下加載庫的問題(dlopenm, dlsym)

如題,?程序中發(fā)現(xiàn)load庫成功,但是加載函數(shù)的時候報錯:?undefined?symbol?functionname

是很簡單的一個東西,因為不熟悉,所以老是弄不好,請各位指導(dǎo)!

代碼如下:

//?SCTLX_DefaultOperationManager.h文件

#ifndef__SCTLX_DEFAULTOPERATIONMANAGER_H

#define__SCTLX_DEFAULTOPERATIONMANAGER_H

/******************************************

名稱:SCTDefaultOperationManager

描述:默認(rèn)操作功能

參數(shù):

pszLeft:接口預(yù)留

nLeft:接口預(yù)留

pszErrInfo:錯誤信息

返回:

0:成功

-1:失敗

******************************************/

extern?"C"?int?SCTDefaultOperation(char*?pszLeft,?int?nLeft,?char*?pszErrInfo);

#endif//__SCTLX_DEFAULTOPERATIONMANAGER_H

----------------------------------------------------------------------------------

//?cpp文件

#include?"stdlib.h"

#include?"stdio.h"

#include?"string.h"

using?namespace?std;

int?SCTDefaultOperation(char*?pszLeft,?int?nLeft,?char*?pszErrInfo)

{

charpLeft[1024];

intiLeft;

charpErrInfo[1024];

memset(pLeft,?0x00,?1024);

memset(pErrInfo,?0x00,?1024);

iLeft?=?0;

memcpy(pLeft,?pszLeft,?1024);

memcpy(pErrInfo,?pszErrInfo,?1024);

iLeft?=?nLeft;

printf("默認(rèn)操作:?什么也不做!...\n");

return?0;

}

----------------------------------------------------------

/

//?主程序

...

typedefint(*Function)(char*?pszLeft,?int?nLeft,?char*?pszErrInfo);

stringg_strDllList[1024];

Functiong_FuncList[1024];

void*g_dl[1024];

...

intiLoadDll(const?char*?pDllPath)

{

intiDllNo;

iDllNo?=?-1;

if?(pDllPath?==?NULL)

return?-1;

if?(strlen(pDllPath)?==?0)

return?-1;

for?(iDllNo=0;?iDllNo<1024;?iDllNo++)

{

if?(g_strDllList[iDllNo].length()?!=?0?&&?g_strDllList[iDllNo]?==?pDllPath)

{

printf("lib?has?been?loaded,?skipping...\n",?pDllPath);

return?iDllNo;

}

}

for?(iDllNo=0;?iDllNo<1024;?iDllNo++)

{

if?(g_dl[iDllNo]?==?NULL)

{

g_dl[iDllNo]?=?dlopen(pDllPath,?RTLD_NOW);

if?(dlerror()?!=?NULL)

return?-1;

else

{

printf("load?lib?successed:?%s\n",?pDllPath);

g_strDllList[iDllNo]?=?pDllPath;

return?iDllNo;

}

}

}

}

intiLoadFunc(int?iNodeNo,?int?iDllNo,?const?char*?pFuncName)

{

if?(iNodeNo??1024)

return?-1;

if?(iDllNo??1024)

return?-1;

if?(pFuncName?==?NULL)

return?-1;

if?(strlen(pFuncName)?==?0)

return?-1;

printf("NodeNo:?%d,?load?function:?%s\n",?iNodeNo,?pFuncName);

g_FuncList[iNodeNo]?=?(Function)dlsym(g_dl[iDllNo],?pFuncName);

if?(g_FuncList[iNodeNo]?==?NULL)

{

printf("%s\n",?dlerror());

printf("NodeNo:?%d,?load?function?failed!\n",?iNodeNo);

return?-1;

}

return?0;

}

------------------------------------------------------------

/

//makefile

.PHONY:?default

default:

g++?-Wall?-W?-shared?-fPIC?-o?$(TargetPath)libSCTLX_DefaultOperationManager.so?$(DefaultPath)SCTLX_DefaultOperationManager.cpp

.PHONY:?dpscheck

dpscheck:

g++?-ldl?-o?$(TargetPath)dpscheck?SCTLX_Maintain.cpp?libini.a

網(wǎng)上搜了一些,大多是說要加個extern?"C"的。。。。

分享到:

更多

------解決方案--------------------

你可以去看看gcc和g++的區(qū)別

總結(jié)

以上是生活随笔為你收集整理的linux dlopen 内存,Linux下加载库的有关问题(dlopenm, dlsym)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。