链接.o文件时缺少Vtable

时间:2013-07-14 01:50:31

标签: c++ linker vtable

我正在使用ZeroC的ICE编写一个简单的服务器程序。当我尝试链接.o文件时,它给了我以下错误消息:

$ c++ -o server UserMap.o Server.o -L/Library/Developer/Ice-3.5.0/lib -lIce -lIceUtil
Undefined symbols for architecture x86_64:
  "VTT for UserMapI", referenced from:
      UserMapI::UserMapI() in Server.o
  "vtable for UserMapI", referenced from:
      UserMapI::UserMapI() in Server.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

经过一些谷歌搜索我明白问题是我有一个抽象类,其中有3个虚拟方法在UserMap.ice中声明(因此在UserMap.hUserMap.cpp由命令{{1}生成在slice2cpp UserMap.ice中,我有一个名为Server.cpp的类,它实现了三个虚方法和另一个私有帮助函数。生成错误是因为编译器认为我已在UserMapI:public UserMapUserMap.h中声明了所有函数(方法)。

我对这个问题的理解是我应该修改link命令,以便链接器知道UserMap.cpp中声明的UserMapI中有更多的函数,但是我没有足够的知识来做修改。有人能帮帮我吗?

谢谢大家。


以下是我用来获取Server.cppServer.o的编译器命令:

UserMap.o

以下是c++ -I. -I/Library/Developer/Ice-3.5.0/include -c UserMap.cpp Server.cpp 的代码:

UserMap.ice

module DR { class UserMap { void addUserToLocation(int userID, int x, int y); string getUsersNearLocation(int x, int y, int distance); void removeFromMap(int userID, int x, int y); }; }; 命令将此slice2cpp文件分割为.ice.h文件,作为服务器和客户端之间的API。

.cpp我有以下内容:

Server.cpp

以及以下子类:

#include <Ice/Ice.h>
#include "UserMap.h"

#include <map>
#include <string>
#include <vector>
#include <iostream>
#include <sstream>

在实现所有方法后,class UserMapI : public UserMap { public: virtual void addUserToLocation(int userID, int x, int y, const Ice::Current &); virtual string getUsersNearLocation(int x, int y, int distance, const Ice::Current &); virtual void removeFromMap(int userID, int x, int y, const Ice::Current &); private: string stringify(int x, int y); }; 函数:

main

这是UserMap.h

0 个答案:

没有答案