LNK2019错误 c++ 未解析的外部符号

5
我得到了这些错误信息:

错误1 error LNK2019:未解析的外部符号“public: void __thiscall ArrayIntStorage::sortOwn(void)”(?sortOwn@ArrayIntStorage@@QAEXXZ)在函数_main G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\main.obj C_Style_Array中引用

错误2 error LNK2019:未解析的外部符号“public: void __thiscall ArrayIntStorage::sortStd(void)”(?sortStd@ArrayIntStorage@@QAEXXZ)在函数_main G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\main.obj C_Style_Array中引用

错误3 error LNK2019:未解析的外部符号“class std :: basic_ostream >&__cdecl operator <<(class std :: basic_ostream >&,class ArrayIntStorage const&)”(?6@YAAAV?$ Basic_ostream @ DU?$ Char_traits @ D@std @@ @ std @@AAV01@ ABVArrayIntStorage @@ @Z)在函数_main G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\main.obj C_Style_Array中引用

错误4 error LNK2019:未解析的外部符号“class std :: basic_istream >&__cdecl operator >>(class std :: basic_istream >&,class ArrayIntStorage&)”(?5@YAAAV?$ Basic_istream @ DU?$ Char_traits @ D@std @@ @ std @@AAV01@AAVArrayIntStorage @@ @Z)在函数_main G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\main.obj C_Style_Array中引用

错误5 error LNK2019:未解析的外部符号“public: bool __thiscall ArrayIntStorage::setReadSort(bool)”(?setReadSort@ArrayIntStorage@@QAE_N_N@Z)在函数_main G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\main.obj C_Style_Array中引用

错误6 error LNK1120:5个无法解析的外部符号 G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\Debug\C_Style_Array.exe 1 1 C_Style_Array

我不知道发生了什么事情,我在想是否漏掉了什么? 我是新手,它没有给我任何行号,所以我不确定要给你哪些代码,所以我会给你这部分。

#include <fstream>
#include <iostream>
using namespace std;
#include "ArrayIntStorage.h"

int main(int argc, char **argv) {

ifstream fin1("ACW2_data.txt");
ofstream out1("1-arrayUnsortedRead.txt");
ofstream out2("2-arrayUnsortedRead-thenSTDSort.txt");

if(!fin1.is_open()) 
{
    cout << "FAIL" << endl;
    return 1;
}

ArrayIntStorage arrayStorage1;
arrayStorage1.setReadSort(false);   // do not read sort

// read in int values into data structure
fin1 >> arrayStorage1;

// output int values in data structure to file
out1 << arrayStorage1;

// sort data structure using std
arrayStorage1.sortStd();

// output int values in data structure to file
out2 << arrayStorage1;

fin1.close();
out1.close();
out2.close();
5个回答

4

您的链接器(编译器的一部分)无法找到 ArrayIntStorage::sortOwn() 的定义。

这通常是由以下两个原因之一引起的:

  1. ArrayIntStorage::sortOwn() 的定义在另一个 .c 文件中,但您忘记告诉编译器(因此未被编译),
  2. ArrayIntStorage 是一个仅限头文件库(因此没有其他 .c 文件),在这种情况下,您可能已经忘记实现函数 sortOwn(),只有声明而已。
  3. ArrayIntStorage 是一个尚未链接的外部库。(如 Tomalak Geretkal 所指出,并通过按照 paxdiablo 制定的步骤解决)

如果以上三种情况都不是您所遇到的问题,或者您觉得选项太复杂,请发布包含头文件 ArrayIntStorage.h 和相应的 .c 文件(如果有)。


3
这是一个链接错误,一旦您了解了这个过程,就可以轻松解决。
通过在源代码中包含头文件#include,让编译器知道它所需的定义。
然而,还需要额外的步骤。您必须将所有各种对象文件和库链接在一起。
这是因为,虽然头文件包含有关ArrayIntStorage的信息,但实际的代码在其他地方。这就是在链接阶段引入的内容。
基本上,您需要确保对象文件或库已包含在构建过程中。
例如,以下gcc命令将包括abc.o对象模块,并引入来自libxyz.a存档库所需的任何内容:
gcc -o myprog myprog.c abc.o -L/path/to/libs -lxyz

针对不同的环境,可能需要以不同的方式进行。例如,集成开发环境(IDE)很可能将其放在项目设置中。

这个答案提供了一些编译和链接过程的更多信息,这在许多环境中都很常见。


2

您忘记链接ArrayIntStorage函数定义所在的库。阅读该库的文档以了解如何在项目中使用它。


1

看起来ArrayIntStorage已经编译成了一个库。请检查您项目的链接器细节,并添加该库。


0

这段代码可能与本问题的代码无关,但如果您忘记在库中导出函数声明,然后尝试从该库外部使用该函数,则也会出现此错误。例如,以下代码:

bool operator==(const Foo &a, const Foo &b);

应该变成

MY_EXPORT_MACRO bool operator==(const Foo &a, const Foo &b);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接