'错误LNK2019:未解析的外部符号'是什么意思?

时间:2012-04-18 04:07:17

标签: c++

我正在尝试运行程序,但它不会编译,我会收到错误。我改变了一些东西,但似乎没有用。代码是这样的:

#include <iostream>
#include <string>
#include "StackLS.h"
using namespace std;


 int main()
   {
int answer;
char symbol;
char n, N;
StackLS stack;
bool balenced = true;

      do {
    cout << " ********** MENU ********** " << endl;
    cout << " 1. Basic Brackets () " << endl;
    cout << " 2. Standard Brackets ()[]{} " << endl;
    cout << " 3. User-Defined brackets " << endl;
    cout << " Please enter your choice: " << endl;

switch (answer){
case 1: 
    cout << "Current Setting: () " << endl;
    cout << "Enter your expression followed by a ; : " << endl;
    cin >> symbol;

    do {    

      if (symbol = '(')
    stack.push( '(' );
      else 
      if (symbol = ')' )
      {
      if (stack.isEmpty())
        balenced = false;
            else {
              symbol = stack.top();
        stack.pop();
    }
if (balenced)
    cout << "Expression is well-formed" << endl;
else
    cout << "Expression is not well-formed" << endl;
       }
           }
    while (symbol != ';' && balenced);
    stack.pop();

        }
       }
      while (answer != 'n' || 'N');

    } // end main

我还没完成这个程序。在进入下一个案例之前,我想确保到目前为止我已编译的内容。现在我将发布我得到的错误。他们是:

  1. 1&gt; e:\ c ++语言2 \格式良好的表达式检查器解决方案\格式正确的表达式检查程序项目\ main.cpp(11):警告C4101:'n':未引用的局部变量

  2. 1&gt; e:\ c ++语言2 \格式良好的表达式检查器解决方案\格式正确的表达式检查程序项目\ main.cpp(11):警告C4101:'N':未引用的局部变量

  3. 1&gt; e:\ c ++语言2 \格式正确的表达式检查器解决方案\格式正确的表达式检查程序项目\ main.cpp(22):警告C4700:未初始化的本地变量'answer'used

  4. 1&GT; ManifestResourceCompile: 1 GT;所有输出都是最新的。

    1. 1&gt; main.obj:错误LNK2019:未解析的外部符号“public:int __thiscall StackLS :: top(void)const”(?top @ StackLS @@ QBEHXZ)在函数_main中引用

      < / LI>
    2. 1&gt; main.obj:错误LNK2019:函数_main中引用的未解析的外部符号“public:void __thiscall StackLS :: push(int const&amp;)”(?push @ StackLS @@ QAEXABH @ Z) / p>

    3. 1&gt; E:\ C ++语言2 \ Well-Form ed Expression Checker解决方案\ Debug \ Well-Formed Expression Checker Project.exe:致命错误LNK1120:2个未解析的外部

    4. 感谢您的帮助。

5 个答案:

答案 0 :(得分:3)

警告只是 - 警告。它们不会阻止您的程序编译,但您应该查看它们并尝试修复它们。

你的程序实际编译好了;错误使其不能链接。这意味着在将代码编译成机器代码并将其构建到*.exe文件中之后,事实证明缺少某些部分。看起来好像StackLS.h文件带有C ++源文件或* .lib或* .dll文件;无论你拥有什么,在构建可执行文件时都需要包含这些内容,以提供那些缺失的部分。

答案 1 :(得分:1)

它已编译,你有一些关于未使用的变量的警告。 链接失败了,所以你缺少的是实现StackLS的文件。

仅包含标题不会使它们“实现”。

所以你需要类似的东西   StackLS.cpp之类的

你没有张贴。

答案 2 :(得分:0)

问题是(可能)不是您的代码,而是您调用编译器/链接器的方式。

您需要编译定义了int StackLS::top() constvoid StackLS::push(int const &)的源文件,并在链接可执行文件时将结果提供给链接器。

答案 3 :(得分:0)

您编写了一个名为StackLS的库。这可以是预编译库或一些源代码。

使用#include "StackLS.h"添加对此库的引用,以允许编译器编译代码。这将创建代码的编译版本。

下一步是将已编译的代码与已编译的StackLS库链接。这是Linker的工作。现在,相同的程序(编译器)通常也会执行此步骤所需的所有调用(尽管您可以链接自己),但从技术上讲,这是编译的不同步骤。

如果StackLS是您的代码,那么您也必须编译它,或者如果它是预编译库,您需要告诉链接器在哪里找到它。

在make文件中,您需要添加对StackLS源代码或库的引用(在这种情况下,它通常是.dll或.lib类型文件)。

答案 4 :(得分:-1)

删除行:

char n,N; StackLS堆栈;

看看你怎么走。