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相关问题的主要内容,如果未能解决你的问题,请参考以下文章