• 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();

    }

  • 相关阅读:
    广东省 自考 可在线 转考
    能吃苦这件事的一些思考
    J link 那个版本 最好用 J link RTT 输出日志 卡
    《PyTorch深度学习实践》刘二大人 第九讲
    《PyTorch深度学习实践》刘二大人 第七讲
    《PyTorch深度学习实践》刘二大人 第三讲
    《PyTorch深度学习实践》刘二大人 第八讲
    Seq2Path: Generating Sentiment Tuples as Paths of a Tree
    A Unified Generative Framework for AspectBased Sentiment Analysis
    《PyTorch深度学习实践》刘二大人 第六讲
  • 原文地址:https://www.cnblogs.com/kingstrong/p/5355955.html
Copyright © 2020-2023  润新知