QT+VS2022 LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const XXX::staticMetaObject@@B

背景:最近在写一个QT代码IDE使用的是VS2022。软件结构是使用在一个解决方案下建一个exe项目外加几个dll项目模组。大概是这样的。

QT+VS2022 LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const XXX::staticMetaObject@@B_第1张图片

然后再masterpaper中注册connect函数。在某个过程中DataStructure这个dll中需要把一个字符串传给masterpaper中。

解决方式有很多,但是QT自带的信号槽机制是最完美的。

我个人是这么想的,于是就实际操作。其他的问题都是小问题就遇到一个折磨我两天的报错。

QT+VS2022 LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const XXX::staticMetaObject@@B_第2张图片在dll中要使用信号槽,肯定是需要添加Q_OBJECT的,使用这个宏是需要继承QOject这个类。QT+VS2022 LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const XXX::staticMetaObject@@B_第3张图片

 写好以后,需要设置一下。

QT+VS2022 LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const XXX::staticMetaObject@@B_第4张图片

这是必须的,有这个才可以生成moc_xxx.cpp文件。

这个是很重要的,因为上面的错误完全是因为找不到这个文件而产生的。

如果你的工程没有进行特殊配置,那到这一步应该就可以结束了。但是我的工程是进行特殊配置的一下。

工程目录大概是这样的。

QT+VS2022 LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const XXX::staticMetaObject@@B_第5张图片

由于代码要上传到gitlee中,所以为了上传的时候简单点,就把编译的中间文件集中存储到一个文件夹下,那就是build中,masterCode完全是存放工程和代码的,outputfile是存放编译好的exe和dll和lib的。这就是我的工程结构。

接下来我遇到坑就是由于我这个工程结构所引起的。

因为我把编译的中间文件单独存到build中,所以moc_xxx.cpp也就在build中,所以我在编译exe的时候总是说无法解析的外部符号。

查看了两个晚上的博客总算是在一个博客中找到一句点醒我的话。

[QT] error LNK2001: 无法解析的外部符号 Qt的moc机制_bbbbbbj的博客-CSDN博客_qt无法解析的外部符号lnk2001

最终解决方法: 在.cpp文件的末尾添加#include "moc_MainWindowBottomWidget.cpp",

 就是在Cpp文件中添加moc_xxx.cpp文件,

我本人的解决方案是添加moc_xxx.cpp的路径,并且添加文件名:

QT+VS2022 LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const XXX::staticMetaObject@@B_第6张图片

把路径问题解决了,接下来就是添加cpp了。

由于exe文件是在masterpaper文件出的错就添加到这里。

QT+VS2022 LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const XXX::staticMetaObject@@B_第7张图片

 然后编译:

QT+VS2022 LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const XXX::staticMetaObject@@B_第8张图片

完全没问题。

运行结果也是我想要的结果。结果就不给展示了,其中逻辑虽然不是很复杂,但是并不是这个问题重点。就不展示了。 

----------------------20220827------------

补充一点:即使模组与exe并没有直接联系,还是需要在exe中添加的

比如:

我新加了一个CPU算法模组 CPUWavelet

QT+VS2022 LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const XXX::staticMetaObject@@B_第9张图片

 1号模组是在2号模组实例化,并且运行的。并没有与3号模组,也就是exe有直接关系,但是编译下来还是会有问题,提示找不到头文件,即使添加到工程中,已经能够找到了,但是还是编译不过,这时候就需要安装上面的过程在来一遍,然后把新模组添加到exe文件中;

QT+VS2022 LNK2001: 无法解析的外部符号 “public: static struct QMetaObject const XXX::staticMetaObject@@B_第10张图片 

 

你可能感兴趣的:(C++知识,QT,qt,开发语言)