【发布时间】:2021-11-10 23:10:10
【问题描述】:
我在 Win10 中有一个 Qt+cmake 项目。 项目结构是
- 主要
- 主窗口
- DLL1
- 1 类
- DLL2
- 2 类
Class1 和 Class2 都是 QObject 的子类。 MainWindow 作为一个可执行文件,包括 Class1 和 Class2。 Class2 包括 Class1。但是,编译器警告:
mocs_compilation.cpp.obj:-1: error: LNK2019: unresolved external symbol "public: static struct QMetaObject const Class1::staticMetaObject" ...
Class2.cpp.obj:-1: error: LNK2001: unresolved external symbol "public: static struct QMetaObject const Class1::staticMetaObject" ...
我已经完成了:
- 定义用于从 dll 导出类的宏。
#if defined(DLL_DECL)
#define DLL_DECL_SPEC Q_DECL_EXPORT
#else
# define DLL_DECL_SPEC Q_DECL_IMPORT
#endif
- Class1 就是这样定义的。
class DLL_DECL_SPEC Class1: public QObject
{
Q_OBJECT
...
}
- Class1 可以在 MainWindow 中成功实例化。
- 当 Class2 包含 Class1 时,编译总是失败并出现上述错误。
我试过了:
- 其他非 QObject 类可以在 MainWindow 和 Class2 中成功实例化。
- 我已经检查了 target_link_libraries。主要链接 DLL1 和 DLL2。 DLL2 链接 DLL1。
- 我尝试在 Class2 的标头中仅通过其名称声明 Class1,在 Class2 的 cpp 中声明
#include "Class1.h"。错误仍然存在...
您对这些错误有任何想法吗?在 Qt 中,一个 QObject 类是否只允许使用一次?有什么办法可以解决吗?
感谢您的任何建议!
【问题讨论】:
-
我没有做任何特别的事情(在 dll 中正常导出符号)来完成这项工作。是的,我正在使用 Qt + CMake + dlls + Visual Studio,
-
您必须为每个 .dll 设置单独的 DLL_DECL_SPEC(每个都只在其自己的 .dll 中定义)。 dll),所以你需要
#if defined(DLL_DECL1) #define DLL_DECL_SPEC1 ...和#if defined(DLL_DECL2) #define DLL_DECL_SPEC2 ...。 P.S.:这与 Qt 无关。 :) -
谢谢克里斯蒂法蒂!和你说的完全一样。我重命名了宏并解决了。 :)
标签: c++ windows qt dll qobject