【问题标题】:Qt: LNK2001 and LNK2019 Errors arise after implementing a signal/slot across source filesQt:LNK2001 和 LNK2019 跨源文件实现信号/槽后出现错误
【发布时间】:2012-05-10 00:16:07
【问题描述】:

这由我的 MainWindow 文件中的声明组成,为简洁起见,我没有包含库包含。我在这两个库和所有必需的库中都包含了 QObject.h。在包含第二个连接调用之前,它编译得很好。第一个 Ctrl-C 处理程序工作正常。

I took out my code, thought my employer wouldn't like it. See the appropriate response below!

我正在使用 QT Creator。当我用谷歌搜索这些错误消息时,提供的大多数解决方案都围绕着修复 make 命令/路径或在 Visual Studio 中编译时发生的类似问题。

我重申,这些错误仅在包含全局 GCamera 和 MainWindow 的第二个连接调用之后才出现。该程序在此之前正在编译和运行。

提前感谢您,对于冗长的帖子,我深表歉意,并期待收到任何意见。

【问题讨论】:

  • 为什么要在 QObject #include 周围使用标头保护?另外,您是否尝试过运行 qmake?最后,您是否在包含 MainWindow 构造函数的文件中添加了#include "tcamera.h"(或任何该头文件被调用)?
  • 是的,我有。我只是认为包含头卫会更安全,按照我的理解,包含它们并没有什么害处,对吧?除非那里有问题,否则所有包含的内容都已处理完毕。此外,如果它是一个依赖问题,那么在实现连接之前就会提出链接器问题......虽然我没有尝试过 qmake,让我试试。
  • 通常在头文件的顶部包含头文件保护,以确保在该文件中声明的类(非子类)不会被多次声明。尝试移除防护装置,看看会发生什么。
  • 我在两个文件上都试过了(都包括 QObject),这并没有改变任何东西。守卫不应该影响任何东西,它们只是为了保护东西不被包含两次左右。
  • 由于这是一个链接器问题,最好查看两个头文件的完整内容。

标签: c++ qt linker qt-creator


【解决方案1】:

您应该有一个名为 moc_tcamera.cpp 的文件,它实现了构建目录中缺少的符号。

如果它不存在,您应该“运行 qmake”,然后“重建”您的项目(这两个操作都在 Qt Creator Build 菜单中)。

为什么会出现错误:

qmake 为所有包含宏 Q_OBJECTQ_GADGET 的源文件的 Makefile 添加一个 moc(Qt 的元对象编译器)步骤,这样的文件被称为“mocable”。一旦文件被检测为可移动或不可移动,在重新运行 qmake 之前,该状态不会改变。

QtCreator 仅在 .pro 文件更改时(例如,添加或删除文件时)自行运行 qmake。

这意味着您可能在文件tcamera.h 中没有Q_OBJECT 宏的情况下编译了一次项目,然后添加了该宏。并且因为在添加对 connect 的调用之前不需要元对象,VC++ 不会尝试解决丢失的符号。

【讨论】:

  • 这确实解决了错误...但是你能告诉我运行 qmake 的作用吗?为什么会出现这样的错误?谢谢。
  • 我想知道您是否可以解释为什么会弹出该错误以及为什么运行 qmake 可以修复它。我是 Qt 和 C++ 的新手,这将为遇到这个问题的人提供更好的答案。谢谢。
【解决方案2】:

例如,当您在 .pro 文件中包含标头而不是源文件时,您可能会遇到链接器错误。例如在您的 .pro 文件中:

HEADERS += t_camera.h foo.h
SOURCES += foo.cpp 

会导致您遇到链接器错误,通常是 LNK2001 和 LNK2019。但是,IIRC QtCreator 会为您管理 .pro 文件,对吗?换句话说,确保您的 .pro 文件是正确的。如果不是,我会感到惊讶,但 .pro 文件中的错误可能会导致您看到的问题。

【讨论】:

  • 确认。刚刚看到这个“..这些错误仅在包含全局 GCamera 和 MainWindow 的第二个连接调用之后才出现。”所以我的回答可能对您没有帮助,但我将它(现在)留在这是一个 .pro 文件问题的可能性很小。
  • 这绝对不是专业问题,上面的答案似乎解决了它,但我很感激你的回应!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 2011-10-10
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多