zoukankan      html  css  js  c++  java
  • Qt不同版本编译器,调用VC++生成的动态链接库

    今天用QT编译生成的共享库自己却怎么都不能调用,查了N久后找到这个帖子,发现搞定了,记录一下

    http://qiusuoge.com/12720.html

    Qt如何调用VC++生成的动态链接库?假设当前有VC++编译器生成的动态库文件testdll.h,testdll.lib和testdll.dll。

    testdll.h文件源码如下:

    #ifdef TESTDLL_EXPORTS

    #define TESTDLL_API __declspec(dllexport)

    #else

    #define TESTDLL_API __declspec(dllimport)

    #endif

    // 此类是从 testdll.dll 导出的

    class TESTDLL_API Ctestdll {

    public:

    Ctestdll(void);

    public:

    int Add(int a, int b) {return a+b;}

    int Sub(int a, int b) {return a-b;}

    int Mul(int a, int b) {return a*b;}

    };

    extern TESTDLL_API int ntestdll;

    TESTDLL_API int fntestdll(void);

    Qt如何使用这些动态链接库文件?

    一、情况1,编程环境是Qt Creator+Qt libraries 4.8.6 for Windows (VS 2010)

    Qt库是VS2010版本,VC++编译器生成的。所以工程可以直接使用testdll.h头文件和testdll.lib引入库文件。

    1、把testdll.h拷贝到工程路径;

    2、工程文件XXX.pro需要手动添加"HEADERS += testdll.h"和"LIBS += testdll.lib";

    3、编译前,需要把lib文件:testdll.lib和testdll.dll一起拷贝到构建路径下面。

    如此便可以正常使用VC++动态链接库函数。

    二、情况2,编程环境是Qt Creator+Qt libraries 4.8.6 for Windows (MinGW 4.8.2)

    Qt库是MinGW版本,gcc编译器生成,与VC++编译器不是同个体系。所以工程不可以使用testdll.h头文件和testdll.lib引入库文件。

    对于调用DLL的方法,Qt本身就有相应的类来实现。

    #include "dialog.h"

    #include <QApplication>

    #include <QLibrary>

    typedef int (*func_Add)(int a, int b); //定义函数指针

    typedef int (*func_Sub)(int a, int b);

    typedef int (*func_Mul)(int a, int b);

    int main(int argc, char *argv[])

    {

        QApplication a(argc, argv);

        QLibrary mylib("testdll.dll");//testdll.dll的存放路径与.exe一致

        if (mylib.load())

        {

    //"?Add@Ctestdll@@QAEHHH@Z"等字符串其实就是动态库函数int Add(int a, int b)的变体,请使用微软工具DEPENDS.EXE查看得到

            func_Add f1 = (func_Add)mylib.resolve("?Add@Ctestdll@@QAEHHH@Z");

            func_Sub f2 = (func_Sub)mylib.resolve("?Sub@Ctestdll@@QAEHHH@Z");

            func_Mul f3 = (func_Mul)mylib.resolve("?Mul@Ctestdll@@QAEHHH@Z");

            int rt = 0;

            if (f1 != NULL)

            {

                rt = f1(10, 12);

            }

            if (f2 != NULL)

            {

                rt = f2(10, 12);

            }

            if (f3 != NULL)

            {

                rt = f3(10, 12);

            }

        }

        Dialog w;

        w.show();

        return a.exec();

    }

  • 相关阅读:
    HDU 1010 Tempter of the Bone(DFS剪枝)
    HDU 1013 Digital Roots(九余数定理)
    HDU 2680 Choose the best route(反向建图最短路)
    HDU 1596 find the safest road(最短路)
    HDU 2072 单词数
    HDU 3790 最短路径问题 (dijkstra)
    HDU 1018 Big Number
    HDU 1042 N!
    NYOJ 117 求逆序数 (树状数组)
    20.QT文本文件读写
  • 原文地址:https://www.cnblogs.com/kingstrong/p/5355955.html
Copyright © 2011-2022 走看看