关于C ++中的“未定义引用”

时间:2011-10-16 01:51:21

标签: c++

=)

我对C ++中的“未定义引用”有疑问。

在这段代码中我有下一个:

#include "HelloWorldAgent/helloworldagent.hh"

int main()
{
   HelloWorldAgent agent;
   agent.run();
}

在另一个C ++文件中是下一个代码:

#ifndef _HELLOWORLDAGENT_HH_
#define _HELLOWORLDAGENT_HH_

#include "../../HumanoidAgent/humanoidagent.hh"

/**
 *  A friendly robot
 */
class HelloWorldAgent : public bats::HumanoidAgent
{
/**
 * Initialize agent
*
* Called a single time when starting up the agent. Put all your initialization stuff  
here.
*/
virtual void init();

/**
* Think cycle
*
* Called at each cycle after a message from the server is received and parsed. 
Put all your thinking and acting stuff here.
*/
virtual void think();

public:

/**
*  The Constructor
*
*  Sets this agent's teamname to "Hello". Consider putting initialization stuff in 
init() instead of here.
*/
HelloWorldAgent()
: HumanoidAgent(std::string("Hello"))
{
}

};

#endif

我尝试用g ++编译它

$ g ++ -I / usr / include / eigen -I /usr/include/sigc++-2.0 -I /usr/lib/sigc++-2.0/include helloworld.cc

然后给我下一个错误:

在/usr/lib/gcc/i486-slackware-linux/4.5.2/../../../../include/c++/4.5.2/ext/hash_map:60中包含的文件中: 0,                  来自HelloWorldAgent /../../ HumanoidAgent /../ WorldModel /../ Hashclasses / hashclasses.hh:25,                  来自HelloWorldAgent /../../ HumanoidAgent /../ WorldModel / worldmodel.hh:54,                  来自HelloWorldAgent /../../ HumanoidAgent / humanoidagent.hh:46,                  来自HelloWorldAgent / helloworldagent.hh:44,                  来自helloworld.cc:1: /usr/lib/gcc/i486-slackware-linux/4.5.2/../../../../include/c++/4.5.2/backward/backward_warning.h:28:2:警告:#警告此文件包含至少一个已弃用或过时的标题,可能会在将来某个日期删除,恕不另行通知。请使用具有等效功能的非弃用接口。有关替换标头和接口的列表,请参阅文件backward_warning.h。要禁用此警告,请使用-Wno-deprecated。 /tmp/cc1cjIEs.o:在函数main': helloworld.cc:(.text+0x29): undefined reference to bats :: HumanoidAgent :: run()' /tmp/cc1cjIEs.o:在函数HelloWorldAgent::HelloWorldAgent()': helloworld.cc:(.text._ZN15HelloWorldAgentC2Ev[_ZN15HelloWorldAgentC5Ev]+0xfd): undefined reference to vtable for HelloWorldAgent'中 /tmp/cc1cjIEs.o:在函数HelloWorldAgent::~HelloWorldAgent()': helloworld.cc:(.text._ZN15HelloWorldAgentD2Ev[_ZN15HelloWorldAgentD5Ev]+0xb): undefined reference to vtable for HelloWorldAgent'中 collect2:ld返回1退出状态

我不知道它会是什么,也许我做错了什么。有什么想法吗?

提前致谢。 =)

PS:不,这不是功课,只是为了好玩=)

2 个答案:

答案 0 :(得分:1)

您尚未将实现(定义)包含在HelloWorldAgent中的虚拟函数中。确保将具有这些定义的任何文件与其余文件同时传递给G ++(或使用-c一次编译一个文件到.o文件,然后在最后的链接步骤中将它们链接在一起)

答案 1 :(得分:0)

解决这个问题的最简单方法是在g ++命令行中包含.cc文件,该文件具有在HelloWorldAgent类中声明的方法的实际定义。由于你似乎唯一正在调用的方法是run(),你必须在.cc文件中的某个地方定义它。