背景: 在开发图形化挖矿软件时, 需要调用非界面软件接口. 思路 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);
代码不规范, 方法仅供参考
来源: http://www.bubuko.com/infodetail-2805585.html