链接器错误2019而不接触链接器属性



所以我正在制作一个游戏,它运行得很好,所以我开始开发游戏的下一部分,即分块系统和生成(你可能可以从我之前的帖子中看出(,但突然之间我出现了一些随机的链接器错误,尽管我没有接触过链接器中的任何东西,游戏以前运行得也很好。以下是错误:

Error   3   error LNK2019: unresolved external symbol "public: class sf::Sprite __thiscall AbstractBlock::draw(void)" (?draw@AbstractBlock@@QAE?AVSprite@sf@@XZ) referenced in function _main   C:(Insert personal stuff here)Main.obj    Top Down Shooter
Error   4   error LNK2019: unresolved external symbol "public: void __thiscall AbstractBlock::destroy(class b2World *)" (?destroy@AbstractBlock@@QAEXPAVb2World@@@Z) referenced in function "public: int __thiscall Universe::saveGame(void)" (?saveGame@Universe@@QAEHXZ)  C:(Insert personal stuff here)Universe.obj    Top Down Shooter
Error   5   error LNK1120: 2 unresolved externals

他们没有行号,问题似乎出在Universe.obj和main.obj?老实说,我不知道这些是什么,所以我将完整地发布这两个.cpp文件:

Universe.cpp:

#include "Universe.h"
Universe::Universe(){
    world = new b2World(b2Vec2(0, 0));
    world->SetAllowSleeping(false);
    chunkManager = new ChunkManager(world);
    player = new Player(world);

}

Universe::~Universe()
{
}
int Universe::saveGame(){
    player->destroy(world);
    player = nullptr;

    std::list<AbstractBlock>::iterator i;
    for (i = getLoadedBlocks()->begin(); i != getLoadedBlocks()->end(); i++){
        i->destroy(world);
    }
    world = nullptr;
    return 1;
}
void Universe::spawnEntity(int x, int y, int entityID){
}
std::list<AbstractBlock>* Universe::getLoadedBlocks(){
    return chunkManager->getLoadedBlocks();
}
void Universe::update(){
    player->update();
    world->Step(1 / 60.f, 8, 3);
}
Player* Universe::getPlayer(){
    return player;
}

Main.cpp:

#include <iostream>
#include "Box2DBox2D.h"
#include "SFML/Graphics.hpp"
#include "Universe.h"
#include "simplexnoise.h"
int main(){
    static int FPS = 1.f / 60.f;
    sf::RenderWindow window(sf::VideoMode(640, 480), "Top Down Shooter");
    sf::Event event;
    Universe universe;
    bool running = true;
    int distX;
    int distY;
    float angle;
    while (running){
        window.clear(sf::Color::White);
        while (window.pollEvent(event)){
            switch (event.type){
            case sf::Event::Closed:
                running = false;
                break;
            case sf::Event::KeyPressed:
                switch (event.key.code){
                case sf::Keyboard::Q:
                    running = false;
                    break;
                case sf::Keyboard::W:
                    universe.getPlayer()->setMoveUp(true);
                    break;
                case sf::Keyboard::A:
                    universe.getPlayer()->setMoveLeft(true);
                    break;
                case sf::Keyboard::D:
                    universe.getPlayer()->setMoveRight(true);
                    break;
                case sf::Keyboard::S:
                    universe.getPlayer()->setMoveDown(true);
                    break;
                }
                break;
            case sf::Event::KeyReleased:
                switch (event.key.code){
                case sf::Keyboard::W:
                    universe.getPlayer()->setMoveUp(false);
                    break;
                case sf::Keyboard::A:
                    universe.getPlayer()->setMoveLeft(false);
                    break;
                case sf::Keyboard::D:
                    universe.getPlayer()->setMoveRight(false);
                    break;
                case sf::Keyboard::S:
                    universe.getPlayer()->setMoveDown(false);
                    break;
                }
                break;
            }

        }
        distX = (sf::Mouse::getPosition().x - universe.getPlayer()->getXpos() - window.getPosition().x - 10);
        distY = (sf::Mouse::getPosition().y - universe.getPlayer()->getYpos() - window.getPosition().y - 30);
        if (distX != 0){
            angle = std::atan2f(distY, distX);
            universe.getPlayer()->setAngle(angle + (b2_pi / 2));
        }
        //Updating the universe
        universe.update();
        //Drawing Everything
        window.draw(universe.getPlayer()->draw());
        std::list<AbstractBlock>::iterator i;
        for (i = universe.getLoadedBlocks()->begin(); i != universe.getLoadedBlocks()->end(); i++){
            window.draw(i->draw());
        }


        window.display();

    }
    universe.saveGame();
    return 0;
}

所以我试图自己解决这个问题,我认为这可能是我使用迭代器和列表绘制宇宙中所有当前块的部分。我这么想是因为Universe和main.cpp中都有这些小的for循环(我最近刚刚添加(。所以我评论了每个文件中的这些部分,事情变得更奇怪了。Visual Studio 2013在我运行程序时给了我错误,然后将我带到xutility文件!我不知道为什么!我一定要注释掉迭代器部分,然后再试一次,但同样的事情发生了!由于这两行迭代器被注释掉了,我在程序中根本没有使用迭代器!为什么它会带我去那里?请帮帮我,我太困惑了<

编辑:AbstractBlock.cpp:

#include "AbstractBlock.h"

AbstractBlock::AbstractBlock()
{
}
AbstractBlock::AbstractBlock(int x, int y, float roation, b2World *world){
}
sf::Sprite AbstractBlock::draw(){
    sf::Sprite sprite;
    return sprite;
}
void AbstractBlock::destroy(b2World *world){
}

AbstractBlock::~AbstractBlock()
{
}

我最初是一名Java程序员,我不确定是否有办法像在Java中那样创建一个"抽象"类,所以我只是创建了一个没有太多定义方法的普通类,然后由其他类继承。

第二次编辑:我还决定展示我的Dirt类,它扩展了我的AbstracBlock类,是迄今为止唯一继承自AbstractBlock:的类

#include "DirtBlock.h"

DirtBlock::DirtBlock()
{
}
DirtBlock::DirtBlock(int x, int y, float rotation, b2World *world){
    bodyDef.position.Set(x, y);
    bodyDef.type = b2_dynamicBody;
    fixDef.density = .1f;
    b2PolygonShape shape;
    shape.SetAsBox(16, 16);
    fixDef.shape = &shape;
    body = world->CreateBody(&bodyDef);
    body->CreateFixture(&fixDef);
    texture.loadFromFile("dirt.png");
}
void DirtBlock::destroy(b2World *world){
    world->DestroyBody(body);
    body = nullptr;
}

DirtBlock::~DirtBlock()
{
}
sf::Sprite DirtBlock::draw(){
    sf::Sprite sprite;
    sprite.setTexture(texture);
    sprite.setOrigin(16, 16);
    sprite.setPosition(body->GetPosition().x, body->GetPosition().y);
    return sprite;
}

第三次编辑:还有!当我尝试运行程序时,VisualStudio会将我带到这里:

 #if _ITERATOR_DEBUG_LEVEL == 2
            if (_Myproxy != _Parent_proxy)
                {   // change parentage
                _Lockit _Lock(_LOCK_DEBUG);
                _Orphan_me();
                _Mynextiter = _Parent_proxy->_Myfirstiter;
                _Parent_proxy->_Myfirstiter = this;
                _Myproxy = _Parent_proxy;
                }

它位于xutility类中,我不知道这是什么。要执行的下一行是_Mynextiter行。

好吧,直接的猜测是您只是忘记了将AbstractBlock.cpp添加到项目中。

最新更新