zoukankan      html  css  js  c++  java
  • 关于不同动态库中同名函数及变量解决方案

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

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

  • 相关阅读:
    黄聪:dreamweaver jquery代码提示安装,DW JQ代码智能提示
    明明白白AOP(你没有理由不心领神会!)
    myeclipse安装svn插件的多种方式
    spring注解
    freemarker入门例子
    MyEclipse10 中的两种FreeMarker插件的安装与配置
    优秀程序员必备的10个技能
    p2psearcher无法连接到KAD网络或ed2k服务器的解决办法
    MyEclipse 8.6.1下载|MyEclipse 8下载|MyEclipse 8.6.1官网下载
    网络技术网站
  • 原文地址:https://www.cnblogs.com/zhonghaijing/p/9782710.html
Copyright © 2011-2022 走看看