MINGW 编译错误提示从FARPROC到void的转换无效,但 MSVC 编译好

void* PluginManager::LoadLIB(const QString i_pluginname)

{

    if (i_pluginname.size() <= 0)

    {

        return NULL;

    }

    QString lib_name = M_PLUGIN_PATH+i_pluginname;

    void* libhandle = NULL;

#ifdef WIN32

    lib_name += QString(".dll");

    libhandle = LoadLibrary(lib_name.toStdWString().c_str());

#else

    lib_name += QString(".so");

    libhandle = dlopen(lib_name.toStdString().c_str(), RTLD_LAZY);

#endif

    return libhandle;

}

 

void* PluginManager::GetSymbolAddress(const void *i_libhandle,const QString i_symbolname) const

{

    void* pSymbol = NULL;

#ifdef WIN32

    if (i_libhandle != NULL)

    {

        pSymbol = GetProcAddress((HMODULE)i_libhandle,  i_symbolname.toStdString().c_str());[W用1]

    }

#else

    if (i_libhandle != NULL)

        pSymbol = dlsym(i_libhandle, i_symbolname.toStdString().c_str());

    }

#endif

    return pSymbol;

}


 [W用1]编译到下划线标注的那句是的时候,就报了如下错误

error: invalid conversion from 'FARPROC {aka int (__attribute__((__stdcall__)) *)()}' to 'void*' [-fpermissive]

         pSymbol = GetProcAddress((HMODULE)i_libhandle, i_symbolname.toStdString().c_str());

原因分析:mingw编译不允许进行隐式转换

解决方法:

pSymbol = (void*)GetProcAddress((HMODULE)i_libhandle, i_symbolname.toStdString().c_str());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mingw是一个在Windows系统上运行的开源C/C++编译器集合,而MSVC是微软的Visual C++编译器。要使用Mingw调用MSVC编译出的DLL,需要注意以下几点: 1. 确保DLL的函数接口使用了C或者标准C++风格的导出方式,避免使用MSVC特有的扩展。 2. 确保Mingw的头文件和库文件与MSVC兼容,这样在编译时才能正确地解析和链接函数。 3. 在Mingw编译选项中,添加MSVC编译生成的DLL的导入库文件。可以使用"-l"选项指定导入库的路径和名称。比如,如果DLL的导入库文件名为"example.lib",则编译命令可以添加"-lexample"选项。 4. 在运行时,确保DLL和应用程序的运行环境相匹配,包括操作系统版本、依赖的运行库版本等。特别是,如果MSVC编译时使用了动态运行时库(如MSVCRT.dll),则需要确保系统上有正确的运行时库版本。 总的来说,Mingw可以通过正确的配置和编译选项来调用MSVC编译出的DLL,但是要注意确保导出接口的兼容性和运行时环境的一致性,以避免编译、链接和运行时的问题。 ### 回答2: Mingw是一种基于GNU工具链的开发环境,而MSVC是微软的编译器。在使用Mingw调用MSVC编译出的DLL时,需要注意一些细节。 首先,要确保DLL的导出函数采用了标准的C调用约定,即使用`extern "C"`进行声明。这是因为Mingw默认使用C调用约定,而MSVC默认使用C++调用约定。 其次,要确保使用Mingw编译器时,指定了正确的头文件路径和库文件路径。通常情况下,MSVC编译器生成的库文件的扩展名为`.lib`,而Mingw使用的是`.a`。因此在编译时要使用正确的库文件。 另外,还需要注意编译时使用相同的编译选项和标志。如果MSVC编译器使用了特定的编译选项或标志,那么在使用Mingw编译时也要保持一致,以免出现不兼容或不可预料的错误。 最后,在链接时需要确保引入了正确的库文件。MingwMSVC在库文件的命名规则上可能有一些差异,要确保使用了正确的库文件。 综上所述,要使用Mingw调用MSVC编译出的DLL,需要注意C调用约定、头文件路径、库文件路径、编译选项和标志的一致性。只有确保这些细节正确无误,才能顺利地在Mingw环境下调用MSVC编译出的DLL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值