具有简单类定义的 C++ 未解析的外部函数

C++ unresolved externals with simple class definition

提问人:Michael 提问时间:2/3/2014 最后编辑:Michael 更新时间:2/5/2014 访问量:242

问:

我不断收到一个无法理解的“来自 Visual Studio 2013 的 C++ 未解决的外部错误。非常感谢您到目前为止的帮助。我已将代码进一步简化为以下形式(但问题仍然存在):

main.cpp:

 #include "Fibonacci.h"

using namespace std;

int main(void){

    int RandInteger = 3;
    Fibonacci Fib(RandInteger);

}

斐波那契

class Fibonacci{
    public:
        Fibonacci(int n=0);

    protected:
        int m_n0, m_n1, m_n;
};

斐波那契.cpp:

#include "Fibonacci.h"

Fibonacci::Fibonacci(int n){
    m_n0 = 0;
    m_n1 = 1;
    m_n = n;
}

此代码在 Visual Studio 2013 中生成以下错误:

错误 2 错误 LNK1120:1 个未解决的外部问题 C:\Dropbox\todo\c++\Exam\Ex2\doesn't work\Exercise 2\fibo1\Fibo1\Debug\Fibo1.exe Fibo1 错误 1 错误 LNK2019:未解析的外部交易品种“public: __thiscall Fibonacci::Fibonacci(int)” (??0Fibonacci@@QAE@H@Z) 在函数 _main C:\Dropbox\todo\c++\Exam\Ex2\doesn't work\Exercise 2\fibo1\fibo1\main.obj Fibo1 中引用

我坚持,但是一旦我将 main.cpp 中的行替换为

        Fibonacci Fib();

即我没有将整数传递给构造函数,一切正常(好吧,它编译并按预期执行任何操作)。

感谢您的帮助!我真的还是被困住了。

C++ 链接器 未解析外部

评论

2赞 Angew is no longer proud of SO 2/3/2014
这两个文件是(同一)项目的一部分吗?cpp
0赞 otisonoza 2/3/2014
我在 CodeBlocks 中成功编译了您的代码,但不得不将 void main 更改为 int main。事实证明,void main 是特定于 VS 的。
0赞 otisonoza 2/3/2014
出于好奇,我在 VS 2013 中尝试了它,它成功地为我编译了。

答:

0赞 AndyG 2/3/2014 #1

函数应返回mainint

void main(void){

应该是

int main(){

编辑:感谢 otisonoza 在评论中指出一些编译器接受 main 的这个定义。除此之外,我看不出您系统中编译器错误的任何原因。您确定您完全按照编写的方式粘贴了代码吗?

另外,在你定义之后的随机刻度是怎么回事?main

}`

此外,.cpp 文件中的每个函数后不需要有分号:

Fibonacci::Fibonacci(int na){
   m_n0 = 0;
   m_n1 = 1;
   m_n = 2;
};

int Fibonacci::getNext(int FnM1, int FnM2){
   return FnM1 + FnM2;
};

可以是

Fibonacci::Fibonacci(int na){
   m_n0 = 0;
   m_n1 = 1;
   m_n = 2;
}

int Fibonacci::getNext(int FnM1, int FnM2){
   return FnM1 + FnM2;
}

评论

1赞 otisonoza 2/3/2014
stackoverflow.com/questions/636829/......一些编译器接受它,Visual C++ 编译器接受它。
0赞 AndyG 2/4/2014
@Michael:这是一个随机的想法:你没有在构造函数中使用参数。尝试将它用于某些事情或完全删除它。未使用的参数通常只会引起警告,但也许您打开了一些选项来将它们称为错误或执行其他操作?我不知道,我只是到达这里。int
1赞 Michael 2/5/2014 #2

我终于找到了我的错误。事实证明,代码本身确实没有任何问题,但我以某种方式破坏了我的 VisualStudio 项目。我真的不是这些事情的专家,但以下是对我有用的东西:

  1. 在 Visual Studio 中创建新的空项目
  2. 将 CPP 文件(包括 *.h 文件)复制到新的项目文件夹中
  3. 通过右键单击项目并使用“添加新项目”将它们添加到此新项目中

我知道这是直接的方法,但我看不出我是如何破坏旧项目的(毕竟它应该足够简单)

感谢你们所有人 - 特别感谢 otisonoza 和 Angew,他们让我走上了正确的轨道,代码(在他们这边有效)没有错,但 Visual Studio 项目没有错。