从另一个文件(C++、QT)访问函数 未解析的外部

Accessing a function from another file (C++, QT) Unresolved external

提问人:George G 提问时间:1/9/2017 最后编辑:George G 更新时间:1/27/2017 访问量:913

问:

我已经为此苦苦挣扎了太久了,并且研究了所有我找不到问题的地方。

我正在用 QT 编写一个 GUI 程序,并且在主程序文件外部但在项目内的某些文件中有一些功能。结构是这样的:

Source files: 
main.cpp 
mainwindow.cpp
signal.cpp
signalparse.cpp

header files: 
mainwindow.h
signal.h
signalparse.h

Signal 是存储一些数据的对象。Signalparse 使用 signal,解析文本文件并将其读入 signal。在将此功能放入我的 GUI 程序之前,我在准系统控制台应用程序上测试了此功能,因此我知道它有效(有效)。

现在,我发现自己尝试从主窗口 .cpp 文件中的 SignalParse.cpp 文件调用函数 ReturnSignal。

SignalParse.h is below:
#include<vector>
#include <iostream>
#include "signal.h"

void ParseLine(std::string*);
std::string ReturnTitle();
std::vector<Signal> ReturnSignal(std::string);

显示我已声明 ReturnSignal。

在 SignalParse.cpp 中,该函数定义为:

vector<Signal> ReturnSignal(string filename)
{
    //does stuff
}

在主窗口.cpp中,我声明了一个

std::vector<Signal> signalList;

来存储从 ReturnSignal 返回的向量。

然后我使用

signalList = ReturnSignal(signalFilePath);

在 MainWindow.cpp 中最终调用此函数并返回我的数据。当注释掉时,没有错误。但是,此行会导致错误:

mainwindow.obj:-1: error: LNK2019: unresolved external symbol "class std::vector<class Signal,class std::allocator<class Signal> > __cdecl ReturnSignal(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?ReturnSignal@@YA?AV?$vector@VSignal@@V?$allocator@VSignal@@@std@@@std@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) referenced in function "private: void __cdecl MainWindow::on_file_open_triggered(void)" (?on_file_open_triggered@MainWindow@@AEAAXXZ)

我一辈子都无法弄清楚为什么这行不通。有人有什么想法吗?我已经找了好几个小时了! 如果我找到解决方案,我很想重写这个问题以使其更普遍适用,但目前我完全被难住了。 多谢。

编辑:正在使用的编译器是Microsoft Visual C++编译器12.0

C++ Qt 头文件 未解析外部

评论

0赞 Ivan Rubinson 1/9/2017
您使用的是什么编译器?你在告诉它什么/makefile?
0赞 George G 1/9/2017
我在QtCreator中使用编译器。它有一个 .pro 文件,用于定义包含哪些文件。
0赞 Ivan Rubinson 1/9/2017
可能没有为编译器提供要编译的源文件,或者没有为链接器提供编译器生成的中间二进制文件。
0赞 George G 1/9/2017
据我所知,编译器知道 cpp 和 h 文件。我不确定 bin 文件。据我所知,我无法在 QT 中更改太多其他内容。
1赞 George G 1/9/2017
我将空文件添加到项目中,并将代码直接放入新文件中。

答:

0赞 George G 1/27/2017 #1

经过一些严重的头痛之后,我找到了一个非常简单的解决方案。我只真正使用过命令行编译器或Visual Studio,我没有想到这一点。

事实证明,为了修复我正在处理的大多数未解决的外部错误,我必须简单地进入构建菜单,清理我的项目,然后“运行 qmake”。在此之后,我所有未解决的外部问题都消失了,我的程序正常工作了。

我不知道为什么我很难找到这些信息,希望它能对类似地点的人有所帮助。