【问题标题】:Linker complains it cannot find existing methods (C++)链接器抱怨找不到现有方法(C++)
【发布时间】:2013-07-28 15:57:49
【问题描述】:

我有一个在头文件中定义并在源文件中声明的方法。当我调用该方法时,链接器会抛出一个错误,说它找不到错误。

错误 1 ​​错误 LNK2019:无法解析的外部符号“public:class Chunk” * __thiscall World::getChunk(short,short)" (?getChunk@World@@QAEPAVchunk@@FF@Z) 在函数 _main 中引用

错误 2 错误 LNK1120: 1 未解决的外部

世界.h:

#pragma once
#include <map>
#include <vector>
#include "Chunk.h"

class World {
public:
    World();
    ~World();
    void generateChunk(short x, short z);
    inline Chunk* getChunk(short x, short z);
private:
    std::vector< std::vector<Chunk*> > loadedChunks;
};

世界.cpp:

#include "World.h"
#include <iostream>

World::World() : loadedChunks(1, std::vector<Chunk*>(1)) {}

World::~World() {
    for(unsigned short x = loadedChunks.size(); x > 0; --x)
        for(unsigned short z = loadedChunks[x].size(); z > 0; --z) {
            std::cout << "Destructed" << std::endl;
            delete loadedChunks[x][z];
        }
}

void World::generateChunk(short x, short z) {
    Chunk chunk(x, z);
    delete loadedChunks[x][z];
    chunk.generate();
    loadedChunks[x][z] = &chunk;
}

Chunk* World::getChunk(short x, short z) {
    return loadedChunks[x][z];
}

稍后当我运行时:

World world;
world.generateChunk(0, 0);
world.getChunk(0, 0);

它不会编译/链接上述错误消息。

【问题讨论】:

    标签: c++ visual-c++ compilation linker


    【解决方案1】:

    您必须在头文件中包含函数定义,因为您将其标记为内联。

    inline Chunk* getChunk(short x, short z);
    

    【讨论】:

    • 不太明白,头文件里有定义。
    • @Binero:你展示的代码,定义在World.cpp,应该定义在World.h
    • 那么当我创建内联方法时,它们应该与声明在同一个文件中定义吗? :O
    • @Binero:是的,当然!使用inline,您可以告诉编译器在编译期间将函数调用替换为其主体。由于每个 TU 都是单独编译的,除非编译器看到定义它不能执行替换。
    • 从来不知道。我在同一个应用程序中有多个实例,但情况并非如此,它仍然有效。 :o
    【解决方案2】:

    getChunk() 是内联定义的 - 因此链接器不会找到它。

    (编辑/添加)。这个修复应该做:

    inline Chunk* getChunk(short x, short z) {
        return loadedChunks[x][z];
    }
    

    并从 cpp 文件中删除实现。

    【讨论】:

    • 如何在不删除它的“内联性”的情况下修复它?
    • 将实现复制到标题中。
    【解决方案3】:

    已经在这里回答:inline function linker error

    您必须在标头中声明正文,因为编译器必须知道它是什么

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 2022-12-28
      • 2010-12-14
      • 2016-07-08
      • 2016-03-30
      相关资源
      最近更新 更多