关于不同动态库中同名函数及变量解决方案

背景:在开发图形化挖矿软件时,需要调用非界面软件接口。思路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);

代码不规范,方法仅供参考

 

转载于:https://www.cnblogs.com/zhonghaijing/p/9782710.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值