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

What does 'Error LNK2019: unresolved external symbol' mean?

本文关键字:外部 符号 是什么 意思 错误 LNK2019      更新时间:2023-10-16

我正在尝试运行一个程序,但它无法编译,我收到错误。我已经改变了一些东西,但似乎不起作用。代码是这样的:

#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>e:\c++ 语言 2\格式正确的表达式检查器解决方案\格式正确的表达式检查器项目\main.cpp(11):警告 C4101:"n":未引用的局部变量

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

  3. 1>e:\c++ 语言 2\格式正确的表达式检查器解决方案\格式正确的表达式检查器项目\main.cpp(22):警告 C4700:使用未初始化的局部变量"answerswer"

1>ManifestResourceCompile:1> 所有输出都是最新的。

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

  2. 1>main.obj : 错误 LNK2019: 函数 _main 中引用的未解析外部符号"public: void __thiscall StackLS::p ush(int const &)" (?push@StackLS@@QAEXABH@Z

  3. 1>E:\C++ 语言 2\格式良好的表达式检查器解决方案\调试\格式正确的表达式检查器项目.exe:致命错误LNK1120:2 个未解析的外部

感谢您的帮助。

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

你的程序实际上编译正常;错误使它无法链接。这意味着,在您的代码被编译成机器代码并构建到*.exe文件中之后,事实证明缺少一些部分。看起来StackLS.h文件附带一个C++源文件,或者一个 *.lib 或 *.dll 文件;无论您拥有什么,都需要在构建可执行文件时包含这些内容,以提供这些缺失的部分。

它已经编译,你得到了一些关于未使用变量的警告。链接失败,因此您缺少的是实现 StackLS 的文件。

仅包含标头并不能使它们"实现"。

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

你没有发布那个。

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

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

你的程序使用了一个名为StackLS的库。这可以是预编译库或某些源代码。

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

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

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

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

删除以下行:

字符 n, N;堆栈LS堆栈;

看看你怎么走。