Qt/CMake 下谜一般的 LNK2001 问题
2024年7月17日大约 2 分钟
今天第三次被这个问题坑了,不写不行。
问题很简单,就是你写了一个类,继承了Qt
的某个类,有Q_OBJECT
宏。
然后编译一点事都没有,链接的时候出问题了,死活都报LNK 2001
错误,这时候你如果不仔细看错误信息去搜,一堆的让你加lib
引用一类的信息,当然是没用。
仔细看错误信息,典型情况下是四个符号找不到,都是staticMetaObject
一类一眼就能看出来是Qt
内部函数的那种符号,但你的类里面命名不可能写这样的声明。想必是Qt
引入的,但Qt
为什么会只声明不实现?
如果用了CMake
,原因可能在于:图省事儿把*.cpp
文件加到了源文件列表中,但对应的*.h
文件没有加。这在大部分情况下是无所谓的,头文件本来就是要展开到*.cpp
文件中才能编译。
但是!对于Qt
,在编译*.cpp
文件之前还有个步骤叫MOC
,想起来没?这个过程会读取头文件,自动生成一个额外的mocs_*.cpp
文件,加入到构建系统中。缺失的这些符号就是本应该在mocs_*.cpp
文件重实现的。Qt Creator想必会自动实现这个功能,但在CMake
中,明确将头文件加入列表,并且开启自动MOC
选项,才会有同样的效果。
这个问题,我之前解决过两次,今天又遇到的时候只是有个模糊的印象,最后还是全面对比之前没有问题的代码才找出来的。
好记性不如发布出来啊!