关于不同动态库中同名函数及变量解决方案
背景:在开发图形化挖矿软件时,需要调用非界面软件接口。思路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!\n",dwError);
}
handler_ccminer_main_in_ccminer(minerparas->argc,minerparas->argv);
FreeLibrary(handle_ccminer);
代码不规范,方法仅供参考
- 关于函数形参与函数内变量同名互相覆盖的问题
- 在js中关于同名变量和函数的地位争夺问题
- 关于我在360笔试中做到的一道毁三观的题(函数与变量同名)
- autohotkey关于函数访问全局变量的解决方案
- C语言学习4: 函数返回值与传入参数,关于函数值传递和类型隐性转换,变量不同的作用域,static变量,多文件编译例如两个C文件,显示函数调用语句跳转,递归,斐波那契数列,多文件编译相同变量的问题。
- 黑马程序员 继承时函数和变量处理方式不同
- 不同语言的变量名、函数名
- 关于C和C++不同源文件中重名变量的问题
- 动态加载DLL实现不同DLL的相同导出函数调用问题
- 一个类如何实现两个接口中同名同参数不同返回值的函数
- dlsym 不同so中的同名函数
- 关于 vs2005 添加类或者变量 出错问题的解决方案
- js循环动态绑定带参数函数遇到的问题及解决方案[转]
- Java中关于子类成员变量与父类成员变量同名
- C++(8):指向不同类型变量或函数的pointer
- 学点 C 语言(34): 函数 - 关于变量(auto、static、register、extern、volatile、restrict)
- MATLAB中nargin函数的用法nargin是用来判断输入变量个数的函数,这样就可以针对不同的情况执行不同的功能。通常可以用它来设定一些默认值。如下例所示: 函数文件 examp.m
- python中关于小数点后面的数四舍五入问题解决的几个函数供大家参考,现在问题是如何动态输入小数点后多少位,比如12.3000这样的