我收到了错误
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
上显示此行足以显示错误。
这是一个普遍的错误,我对如何进一步隔离它毫无头绪,但如果它有所帮助,我已将整个项目包括在this git repo。
答案 0 :(得分:45)
在我看来,Qt Creator显示的错误消息在您理解之前会产生误导,但不会阻止将模板类拆分为标题和实现文件。如果你想一下这条消息:
Symbol(s) not found for architecture x86_64
问题,我原本以为在我看到这个问题时,它会在 Issues 输出中单独声明此错误,并且可能导致用户认为问题是由架构造成的。实际上,它的所有说法都是有一个定义的符号(通常是函数),找不到匹配的实现。
如果您从问题更改为编译输出窗口并向上滚动,您将能够确切地看到无法找到哪些符号;我的用红色显示。令人讨厌的是,问题视图中没有显示缺失符号的详细信息。
只需将函数定义添加到标题中而不实现该函数,就可以轻松复制此错误,从.cpp文件中调用它。然后,您将在“问题”窗口中看到类似的内容
切换到Compile Output视图并向上滚动显示: -
所以现在我们看到实际的问题是,从构造函数PGGui :: PGGui调用了名为PGGui的类中的函数DoSomeStuff,但缺少DoSomeStuff的主体,因为找不到它的符号。
答案 1 :(得分:8)
幸运的是,我已经设法在任何答案之前解决了我的问题,所以,如果有人遇到类似的问题,那么问题是你似乎无法将模板化的类拆分为.cpp和.h文件。将.cpp
文件的所有声明放回.h
解决了问题。
但我仍然有一个遗留问题:重复的符号(这就是我分裂它的原因)。这一次,在external
中将变量声明为.h
,并在一个(只有一个)external
文件中重新声明没有.cpp
关键字的问题,解决了这个问题。
答案 2 :(得分:2)
对我来说,这个问题是因为在添加另一个源文件和标题后没有重建make文件。
在Build下: Cleanall-&gt;运行qMake-&gt;运行
为我修复了错误。
答案 3 :(得分:0)
我的问题是我有一个包含许多子项目的项目,其中一个子项目的专业文件是空的。
答案 4 :(得分:-1)
对我来说,在.cpp文件中声明函数时,我忘了写类对象的名称。
错误:int Zero(int &num)
右:int Common2::Zero(int &num)
Common2是哪个类。