29

我收到错误

Symbol(s) not found for architecture x86_64

试图在 QtCreator 上编译一个项目。当我尝试创建用户定义类的实例时会发生这种情况,Layer. 该类由一个标头layer.h和一个实现组成layer.cpp。它经过测试并在另一个程序中工作。在我的项目中,它包含在qtwidget.h我尝试在qtwidget.cpp. 例如:

Layer<double> text("pq.txt",0.5,0.5,0.5);

开启这条线就qtwidget.cpp足以显示错误。

这是一个如此普遍的错误,我对如何进一步隔离它一无所知,但如果它有帮助,我已经将整个项目包含在这个 git repo中。

4

5 回答 5

53

在我看来,Qt Creator 显示的错误消息在您理解之前是相当具有误导性的,但并不妨碍将模板类拆分为头文件和实现文件。如果您考虑以下消息:

Symbol(s) not found for architecture x86_64

问题,当我看到这个时,我最初认为,它在问题输出中自己声明了这个错误,并可能导致用户认为问题是由架构引起的。实际上,它的所有说法都是有一个已定义的符号(通常是函数),它的匹配实现没有找到。

如果从Issues切换到Compile Output窗口并向上滚动,您将能够准确地看到哪些符号无法找到;我的显示为红色。缺少符号的详细信息没有显示在“问题”视图中,这很烦人。

通过将函数定义添加到标头中并且不实现该函数,从 .cpp 文件中调用它,很容易复制此错误。然后,您将在“问题”窗口中看到类似的内容

找不到符号

切换到编译输出视图并向上滚动显示:-

在此处输入图像描述

所以现在我们看到实际的问题是,在名为 PGGui 的类中的函数 DoSomeStuff 是从构造函数 PGGui::PGGui 调用的,但是由于找不到它的符号,所以缺少 DoSomeStuff 的主体。

于 2013-09-24T10:08:23.970 回答
8

幸运的是,我已经设法在任何答案之前解决了我的问题,因此,如果有人遇到类似的情况,问题是您似乎无法将模板化类拆分为 .cpp 和 .h 文件。将文件的所有声明.cpp放回.h解决的问题。

不过,我仍然有一个遗留问题:重复的符号(这就是我拆分它的原因)。external这一次,在 中声明一个变量,并在一个(也是唯一一个)文件中.h重新声明它而不使用关键字解决了这个问题。external.cpp

于 2013-09-24T06:11:41.080 回答
2

对我来说,这个问题是由于在添加另一个源文件和头文件后没有重建 make 文件造成的。

在构建下: Cleanall->运行 qMake->运行

为我修复了错误。

于 2016-03-30T01:57:47.950 回答
0

我的问题是我有一个包含许多子项目的项目,并且子项目的一个 pro 文件是空的。

于 2017-12-16T11:29:01.287 回答
-1

For me, I forgot to write the name of the class object when declaring the function in .cpp file.

wrong: int Zero(int &num)

right: int Common2::Zero(int &num)

Where Common2 is the class.

于 2018-04-09T15:18:41.467 回答