• 6186阅读
  • 5回复

求大神帮助:QT 使用DLL封装窗体,编译能过,链接通不过 [复制链接]

上一主题 下一主题
离线issfin
 
只看楼主 倒序阅读 楼主  发表于: 2013-03-29
各位大神,我最近做一个项目,需要将 MDISubWindow封装在DLL中,有主窗体调用DLL生成 MDISubWindow窗体,然后贴在 MDIArea中,我尝试写了一个简单的例子,可以编译通过,但是链接无法通过,始终报
Igbqcore.obj:-1: 错误:LNK2019: 无法解析的外部符号 "public: __thiscall CoreForm::CoreForm(class QWidget *)" (??0CoreForm@@QAE@PAVQWidget@@@Z),该符号在函数 "public: class QWidget * __thiscall GBQCore::OpenFile(void)" (?OpenFile@GBQCore@@QAEPAVQWidget@@XZ) 中被引用


抱歉,小弟刚接触QT一直没有找到解决办法,求大神帮助一下!非常感谢!


接口定义单元:
#ifndef IGBQCORE_H#define IGBQCORE_H
#include "GBQCore_global.h"#include <QtWidgets/QWidget>
class GBQCORESHARED_EXPORT GBQCore{public:    GBQCore();    ~GBQCore();public:    QWidget* OpenFile();};
extern "C" GBQCORESHARED_EXPORT GBQCore* getGBQCore();
#endif // IGBQCORE_H


我定义的实例窗体:
#ifndef COREFORM_H#define COREFORM_H
#include <QtWidgets/QWidget>
namespace Ui {class CoreForm;}
class CoreForm : public QWidget{    Q_OBJECT    public:    explicit CoreForm(QWidget *parent = 0);    ~CoreForm();    private:    Ui::CoreForm *ui;};
#endif // COREFORM_H

也就是说dll导出的实际上是上述窗体。
代码在附件中,我试用QT5.0.1做的,感谢大家支持。


实例文件 GBQCore.zip (8 K) 下载次数:3




离线dbzhang800

只看该作者 1楼 发表于: 2013-04-03
离线XChinux

只看该作者 2楼 发表于: 2013-04-03
编译库和使用库,要使用的宏不一样,这个会写windows下DLL就OK。所以看看windows下DLL怎样编写先。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 3楼 发表于: 2013-04-03
我举个例子吧,下面是我的一个项目中的代码,这个是头文件。
在编译DLL的时候,在.pro中加宏BUILDING_MODULEFORM_DLL
  1. DEFINES += BUILDING_MODULEFORM_DLL

在使用这个DLL时,只要添加头文件添加库就行了。
  1. INCLUDEPATH += /your/include_path
  2. LIBS += -L/your/lib_path -lyourlibname


下面是头文件代码
  1. #ifndef CHINUXTEAM_MODULEFORM_HPP
  2. #define CHINUXTEAM_MODULEFORM_HPP
  3. #include <QtGlobal>
  4. #ifdef Q_OS_WIN
  5. #ifdef BUILDING_MODULEFORM_DLL
  6. #define CTDLL_MODULEFORM_API __declspec(dllexport)
  7. #else
  8. #define CTDLL_MODULEFORM_API __declspec(dllimport)
  9. #endif  // BUILDING_MODULEFORM_DLL
  10. #else
  11. #define CTDLL_MODULEFORM_API
  12. #endif  // Q_OS_WIN
  13. #include <QtCore>
  14. #include <QtGui>
  15. #include <QtWidgets>
  16. #include <QtPrintSupport>
  17. #include <common.hpp>
  18. namespace ChinuxTeam
  19. {
  20. class CTDLL_MODULEFORM_API ModuleForm : public QWidget
  21. {
  22.     Q_OBJECT
  23. public:
  24.     // 基类构造函数,依据className参数指定类名
  25.     ModuleForm(const QString &className,
  26.             QWidget *parent = 0, Qt::WindowFlags f = 0);
  27.     virtual ~ModuleForm();
  28.     inline QString className() const {return _className;}
  29.     static int instanceCount(const QString &className = QString());
  30.     static QList<ModuleForm *> instanceList(
  31.             const QString &className = QString());
  32.     inline void setParam(const QVariant &param){_m_param = param;}
  33.     inline QVariant param() const{return _m_param;}
  34. signals:
  35.     // 让主程序在客户区中添加一个TAB页以打开一个网址或本地地址URL
  36.     void addTabWebView(const QString &source, bool isUrl);
  37.     // 在状态栏显示一些信息
  38.     void showStatusText(const QString &msg);
  39.     // 在主程序的客户区中新建或打开一个子功能窗体TAB页
  40.     void openTabForm(ModuleForm *form);
  41.     // 关闭当前Tab页
  42.     void closeSelf();
  43. private:
  44.     static QMultiMap<QString, ModuleForm*> _mapInstance;
  45.     QString _className;
  46.     QVariant _m_param;
  47. };
  48. class CTDLL_MODULEFORM_API PrintForm : public ModuleForm
  49. {
  50.     Q_OBJECT
  51. public:
  52.     PrintForm(const QString &className,
  53.             QWidget *parent = 0, Qt::WindowFlags f = 0);
  54.     virtual ~PrintForm();
  55.     QAction* getActionTitle(){return _m_actTitle;}
  56.     QPrinter* getPrinter(){return &_m_printer;}
  57.     QMenu* getPrintMenu(){return &_m_menuPrint;}
  58. protected:
  59.     virtual bool getDocument(QIODevice *dev, ShowProgress *progress) = 0;
  60. private slots:
  61.     //void _m_printPreviewRequested(QPrinter *printer);
  62.     void _m_exportHtmlWebKit();
  63.     void _m_exportHtmlExtern();
  64.     void _m_PageSetup();
  65.     void _m_printSetup();
  66.     void _m_printPDF();
  67.     void _m_printPreview();
  68.     void _m_printNative();
  69. private:
  70.     QPrinter _m_printer;
  71.     QAction *_m_actTitle;
  72.     QMenu _m_menuPrint;
  73. };
  74. }
  75. #endif

二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 4楼 发表于: 2013-04-03
实际上上面的的 __declspec(dllexport)和__declspec(dllimport)可以分别用Q_DECL_EXPORT和Q_DECL_IMPORT代替。
因为Qt里做了这两个宏的定义。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线issfin
只看该作者 5楼 发表于: 2013-04-17
多谢各位的帮助,问题已经解决了。是我C++这块不太熟,非常感谢
快速回复
限100 字节
 
上一个 下一个