错误 LNK2019:在函数中引用了未解析的外部符号“”,此符号没有被找到。

6

我目前在编译代码时遇到以下错误:

错误 LNK2019:在函数“public: void __thiscall World::processMouse(int,int,int,int)” (?processMouse@World@@QAEXHHHH@Z) 中引用了未解析的外部符号“public: void __thiscall Agent::printSelf(void)” (?printSelf@Agent@@QAEXXZ) World.obj

以下是我的代码:

Agent.h:

class Agent
{
public:
    Agent();

void printSelf();

Agent.cpp:

void Agent::printSelf()
{
printf("Agent species=%i\n", species);
for (int i=0;i<mutations.size();i++) {
    cout << mutations[i];
}
}

GLView.cpp:

void GLView::processMouse(int button, int state, int x, int y)
{
if(world->isDebug()) printf("MOUSE EVENT: button=%i state=%i x=%i y=%i\n", button, state, x, y);

if(button==0){
    int wx= (int) ((x-conf::WWIDTH/2)/scalemult-xtranslate);
    int wy= (int) ((y-conf::WHEIGHT/2)/scalemult-ytranslate);

    world->processMouse(button, state, wx, wy);
}

mousex=x; mousey=y;
downb[button]=1-state;
}


void World::processMouse(int button, int state, int x, int y)
{
 if (state==0) {        
     float mind=1e10;
     float mini=-1;
     float d;

     for (int i=0;i<agents.size();i++) {
         d= pow(x-agents[i].pos.x,2)+pow(y-agents[i].pos.y,2);
             if (d<mind) {
                 mind=d;
                 mini=i;
             }
         }
     if (mind<1000) {
         //toggle selection of this agent
         for (int i=0;i<agents.size();i++) {
            if(i!=mini) agents[i].selectflag=false;
         }
         agents[mini].selectflag= !agents[mini].selectflag;
         agents[mini].printSelf();
         setControl(false);
     }
 }

我有些困惑。我已经很久没有处理这个代码了,所以我不确定发生了什么变化导致出现问题。有人看到什么不对的地方吗?


你正在编译和链接 cpp 文件吗?类定义是否有效?我没有看到任何闭合括号。 - Tyler Jandreau
Visual Studio 不太稳定。有时候,“重建全部”可以解决问题,因为增量重新编译没有重新构建应该重新构建的内容。确保 Agent.cpp 实际上在项目中而不仅仅是目录中的文件。 - Kaz
请问您能否发布一下World::processMouse代码? - billz
我添加了正确的processMouse方法。 - user2472852
2个回答

6
最有可能的原因是您没有链接到Agent.cpp创建的对象。
您应该检查确保它是项目的一部分,而且您正在使用正确的版本,同时编译器也要匹配(因为您表示已经有一段时间没有接触过它,可能是对象是使用早期编译器版本构建的,潜在地使它们不兼容——例如不同的名称缩短方法)。
尝试的第一件事(一旦确定所有正确的文件都在项目中)是完全清理并重新构建。
在其他几点上:
  1. 错误发生在World::processMouse中,这意味着GLView::processMouse的源代码可能无关紧要。

  2. 我觉得您混合使用printfcout有些令人不安。对于严肃的C++编程,您应该避免使用printf。它可以工作,但它主要用于遗留的C支持。


清理并重新构建让我惊喜不已,因为我以为我已经尝试过了。谢谢! - user2472852

3

在 Visual Studio 2008 中也发现了同样的问题。 清理后,再重新构建即可解决。


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