关于不同动态库中同名函数及变量解决方案
Posted zhonghaijing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于不同动态库中同名函数及变量解决方案相关的知识,希望对你有一定的参考价值。
背景:在开发图形化挖矿软件时,需要调用非界面软件接口。思路1,编译ccminer及cpuminer成可执行文件,直接调用;思路2,编译ccminer及cpuminer成动态库,再调用挖矿接口。选择了思路2。调用时,发现时出现端错误。排除参数传递出错等原因后。定位到是两个动态库中存在大量的同名变量及函数。
难点:由于两个动态库存在大量同名变量及函数,直接改函数名十分耗时。
解决方法:显示调用动态库。这样可以避免在程序中调用接口时,会找错库的问题。
Linux下显示调用动态库方法,使用dlopen,dlsym ,eg.
void *handle_ccminer;
int (*handler_ccminer_main_in_ccminer)(int argc, char*argv[]);
handle_ccminer = dlopen("./libccminer.so",RTLD_LAZY);
*(void **)(&handler_ccminer_main_in_ccminer)=dlsym(handle_ccminer,"_Z12ccminer_mainiPPc");
handler_ccminer_main_in_ccminer(argc,argv);
Windows下显示调用动态库方法,使用dlopen,dlsym,eg.
DWORD dwError = 0;
typedef int (*FUNADDR)(int argc, char*argv[]);
HMODULE handle_ccminer = LoadLibrary(TEXT("./ccminer.dll"));
dwError = GetLastError();
FUNADDR handler_ccminer_main_in_ccminer;
if(handle_ccminer)
{
handler_ccminer_main_in_ccminer = (FUNADDR)GetProcAddress(handle_ccminer,"ccminer_main");
}
else
{
dwError = GetLastError();
printf("Fail to load DLL %d!
",dwError);
}
handler_ccminer_main_in_ccminer(minerparas->argc,minerparas->argv);
FreeLibrary(handle_ccminer);
代码不规范,方法仅供参考
以上是关于关于不同动态库中同名函数及变量解决方案的主要内容,如果未能解决你的问题,请参考以下文章