0

我正在尝试运行一个访问 3 个不同类的 main.cpp。出于某种原因,我收到了一个未解决的外部符号错误。从我在网上看到的情况来看,它显然是某个地方的链接错误,但我找不到它。我在下面列出了错误,但其中包含很多信息,我很难找出它的确切含义。

错误:main.obj:-1:错误:LNK2001:无法解析的外部符号“public:__thiscall AtpReader::AtpReader(class std::basic_string,class std::allocator >)”(??0AtpReader@@QAE@V? $basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)

我的代码是:

主.cpp:

#include <iostream>
#include "atlasobject.h"
#include "atp.h"
#include "atpreader.h"
using namespace std;
int main()
{
    AtpReader reader("E:/doc.txt");
    return 0;
}

AtpReader.h:

#ifndef ATPREADER_H
#define ATPREADER_H
#include "atp.h"

class AtpReader
{
public:
    AtpReader();
    AtpReader(string filename);

    void atpReadHeader();
    void atpRead();
    string decryptLine(string line);

    ATP readerATP;

private:
    string file;
};
#endif // ATPREADER_H

atp.h:

#ifndef ATP_H
#define ATP_H
#include "atlasobject.h"
#include "vector"

struct Image{
    string Dim;
    string Vox;
    string Ori;
    char* data;
};

class ATP
{
public:
    ATP();
    vector<AtlasObject> listOfMaps;

private:
    Image referenceImage;
};
#endif // ATP_H

和 AtlasObject.h:

#ifndef ATLASOBJECT_H
#define ATLASOBJECT_H
#include <string>

using namespace std;
class AtlasObject{

public:
    //virtual void create();
    AtlasObject();

    void set_uid(string id);
    void set_label(string l);
    void set_offset(string o);
    void set_mapInfo(string info);
    void set_data(char* inData);
    void set_isEncrypted(int encrypted);

    string get_uid();
    string get_label();
    string get_offset();
    string get_mapInfo();
    char* get_data();
    int get_isEncrypted();

protected:
    string uid;
    string label;
    string offset;
    string mapInfo;
    char *data;
    int isEncrypted;
};
#endif // ATLASOBJECT_H

我的 AtpReader.cpp 是:

#include "atpreader.h"

#include <iostream>
#include <fstream>
#include <stdint.h>
#include <sstream>

AtpReader::AtpReader()
{
    printf("AtpReader()\n");
}

AtpReader::AtpReader(string filename)
{
    printf("AtpReader(%s)\n",filename.c_str());
}
4

4 回答 4

1

Try using g++ in linux terminal make the object files of each of the source codes and then link the object files and run the executable

g++ -c atp.cpp AtpReader.cpp AtlasObject.cpp
g++ -o exe atp.o AtpReader.o AtlasObject.o
./exe
于 2013-10-23T19:02:22.437 回答
1

AtpReader.cpp未构建或其目标文件未链接到最终可执行文件。检查是否在构建目录中创建了 AtpReader.obj/.o。

于 2013-10-23T19:13:30.770 回答
1

我看到您没有在 AtpReader.cpp 中包含 AtpReader.h,但可能您只是在复制/粘贴时错过了它,将其插入此处,因为如果您没有真正包含它,错误会有所不同。另外,我看到您在 main.cpp 中同时包含“atlasobject.h”和“atp.h”,而您并不真正需要它。

稍后编辑:您的问题出在 atp.h ...您的构造函数已声明但从未定义。这样做:ATP(){};

于 2013-10-23T19:24:29.267 回答
0

由于您得到的链接器错误并假设这是您的一些实际代码。由于我看不到任何内联函数、全局常量或变量在范围外使用,我认为问题出在 AtpReader.cpp 中,您是否错过了#include AtpReader.h那里?

仅使用函数原型,编译器可以继续运行而不会出错,但链接器无法解析对地址的调用,因为没有保留函数代码或变量空间。在您创建对链接器必须解析的函数的调用之前,您不会看到此错误。

于 2013-10-23T19:15:30.377 回答