vs2015使用MinGW编译的动态库

工作过程中经常会遇到使用其他开源项目的情况,有些开源项目有vs工程,比如opus,可以直接编译出vs可识别的动态库或静态库,但有些开源项目则没有,此时想要做的就是利用该源代码编译一个或多个库来使用。

MinGw完全可以胜任这些工作,它可以安装autoconf、automake等工具,用来编码源码很方便,折腾半天库终于编译出来了,MinGW下测试也木有问题,但是vs不识别,不识别,不识别。。。

尝试过很多办法,vs总是这种任性,就是不识别。


工作还是需要进行的,库也没法丢,一来没有那能力写出大神级的代码,二来项目也没时间让你搞这种高大上的东东。

那么怎么办呢!突然想到Android源码中经常会用到dlopen这个函数,它的功能就是与硬件厂商协商好接口,然后通过该函数打开硬件厂商的库,从而完成底层工作,但这也导致了,Android属于半开源项目,怪不得被Linux被辞掉。


经过多次尝试,总结出一条:虽然vs链接器无法识别这个库,但编译器识别!!!

假设我们有库libtest.dll,库中有函数void test_fun();

示例代码如下:

#include <Windows.h>

int main()
{
    HMODULE libHandle = LoadLibrary("libtest.dll");

    void *pFunc = GetProcAddress(libHandle, "test_fun");

    void (*funp)() = (void (*)())fFunc;

    funp();

    return 0;
}

编译执行,完美通过,funp也能得到我们想要的结果。

但唯一美中不足的是,LoadLibrary好像只能从动态库中提取C函数,c++中的类好像没戏,也有可能是个人功力不到,不得门径。

所以我这里采取的办法是,当遇到C++代码时,使用C代码将其封装一层。毕竟C和C++是可以完美互调的。


通过这种方式还有一个意料之外的好处,库可以随意换,对使用者而言,没有任何影响,可以完美的当做插件使用。


猜你喜欢

转载自blog.csdn.net/xy_kok/article/details/78442970