Qt - DLL相关问题

Posted

技术标签:

【中文标题】Qt - DLL相关问题【英文标题】:Qt - Dll related problem 【发布时间】:2011-09-03 10:00:24 【问题描述】:

我只是在学习 dll。我在 Qt 中尝试过。首先,我发布 dll 相关文件。

第一个 dll - pro 文件

TEMPLATE = lib

SOURCES += \
    check.cpp

HEADERS += \
    check.h

这个是dll-头文件“check.h”

#ifndef CHECK_H
#define CHECK_H

#include <iostream>

extern "C++" __declspec(dllexport) std::string check();

#endif // CHECK_H

这个是dll - 源文件“check.cpp”

#include <iostream>
#include "check.h"

extern "C++" __declspec(dllexport) std::string check()

    return "dll applied";

我编译了上面的项目文件,得到了 dll 。 dll 的名称是“dll.dll”

现在是主文件。这里我尝试通过dll访问“检查”功能。

#include "check.h"
#include <iostream>
#include "MyMessageBox.h"
#include <QApplication>
#include <QLibrary>
#include <QMessageBox>

typedef std::string (*CheckType) (void);

class MyMessageBox:public QMessageBox

public:
    MyMessageBox(std::string message,QWidget*parent=0):
       QMessageBox(QMessageBox::NoIcon,QString("ErrorMessage"),QString(message.c_str()),QMessageBox::Ok,parent,Qt::Widget)
    
    
;

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

    QApplication app(argc,argv);
    CheckType myCheck;
    QLibrary myLib("dll");
    myLib.load();

    bool ok = myLib.load();
    if(ok)
    
        MyMessageBox mm("Load is done");
        mm.exec();
    
    ok = myLib.isLoaded();
    if(ok)
    
        MyMessageBox mm("Loaded");
        mm.exec();
    
    myCheck = (CheckType) (myLib.resolve("check"));
    if(!myCheck)
    
        MyMessageBox m0("Resolving isn't happened");
        m0.exec();
    
    std::string result = myCheck();

    MyMessageBox mm(result);
    mm.exec();
    return app.exec();

但是当我运行上述应用程序时,我得到“没有发生解析”。这意味着,函数指针变为 NULL。我不知道哪一部分是错的。有人帮帮我吗?

【问题讨论】:

【参考方案1】:

在使用 DLL 编译程序时,您需要 __declspec(dllimport)。一种常见的方法是:

// Windows DLL magic
#if defined(USE_DLL)
# if defined(BUILD_DLL)
#  define DLL_EXPORT  __declspec(dllexport)
# else // BUILD_DLL
#  define DLL_EXPORT  __declspec(dllimport)
# endif // BUILD_DLL
#else // USE_DLL
# define DLL_EXPORT
#endif // USE_DLL

然后您将示例中的__declspec(dllexport) 替换为DLL_EXPORT,并确保上述代码包含在任何导出符号之前。

然后添加

DEFINES += USE_DLL BUILD_DLL

到 dll 的项目文件(当然只有在构建为 dll 时!)和

DEFINES += USE_DLL

到任何使用 dll 导出函数的项目。这很丑陋,但很惯用,而且很有效。

【讨论】:

你是说我必须把 __declspec(dllexport) 放在“check.h”中,当我用“main”文件编译它时。 @prabhakaran:我阐明了您需要在真实代码中使用 DLL 魔术做什么。 我收到此错误“无效或损坏的文件:无法在 0x2C0 读取” @prabhakaran:帮不了你,一定要彻底重建。出现此类错误的其他问题(与我回答的问题无关)出错了。

以上是关于Qt - DLL相关问题的主要内容,如果未能解决你的问题,请参考以下文章

Qt 连接MySQL数据库(很多相关文章)

解决QT出现XXXX.dll不能加载问题

如何用Qt自动拷贝exe依赖的dll

VS-Qt环境下dll

使用VC2005编译真正的静态Qt程序

Qt每天一例10.windows引入动态链接库