急!!有个ice问题令人心碎。请教!

热爱生活 2011-05-06 11:23:33
我做了一个用ice聊天程序。
1)定义SLICE接口。
module Chat {

interface MessageReceiver {
void onMessage(string sender, string msg);
};

dictionary<string, MessageReceiver*> UserList;

interface Room {
bool login(string user, MessageReceiver* receiver);
void logout(string user);
void sendMessage(string user, string message);
};

};
定义两个接口,Room用于服务器端实现,MessageReceiver用于客户端实现。
使用slice2cpp生成C++文件: chat.h, chat.cpp.

2)服务器端实现。
#include <iostream>
#include <Ice/Ice.h>
#include "chat.h"

using std::string;

class ChatRoomI : public Chat::Room {
public:
virtual bool login(const string&, const Chat::MessageReceiverPrx&, const Ice::Current&);
virtual void logout(const string&, const Ice::Current&);
virtual void sendMessage(const string&, const string&, const Ice::Current&);
private:
void broadcast(const string& user, const string& message);
bool notify(const Chat::MessageReceiverPrx& receiver, const string& sender, const string& message);

Chat::UserList users_;
};

bool ChatRoomI::login(const string& user, const Chat::MessageReceiverPrx& receiver, const Ice::Current&) {
if (users_.find(user) != users_.end()) {
return false;
}
users_.insert(Chat::UserList::value_type(user, receiver));
broadcast(user, "---login---");
return true;
}

void ChatRoomI::logout(const string& user, const Ice::Current&) {
users_.erase(user);
broadcast(user, "===logout===");
}

void ChatRoomI::sendMessage(const string& user, const string& message, const Ice::Current&) {
broadcast(user, message);
}

void ChatRoomI::broadcast(const string& user, const string& message) {
Chat::UserList::iterator it = users_.begin(), end = users_.end();
while (it != end) {
if (user != it->first && !notify(it->second, it->first, message))
users_.erase(it++);
else
++it;
}
}

bool ChatRoomI::notify(const Chat::MessageReceiverPrx& receiver, const string& sender, const string& message) {
bool ret = true;
try {
receiver->onMessage(sender, message);
} catch(const std::exception& ex) {
ret = false;
}
return ret;
}

class Server : public Ice::Application {
public:
virtual int run(int argc, char* argv[]) {
Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapterWithEndpoints(
"Chat.RoomAdapter", "default -p 10000");
Chat::RoomPtr room = new ChatRoomI;
adapter->add(room, communicator()->stringToIdentity("Chat.Room"));
adapter->activate();
communicator()->waitForShutdown();
return 0;
}
};

int main(int argc, char* argv[]) {
Server app;
return app.main(argc, argv);
}




3)客户端实现。
#include <iostream>
#include <Ice/Ice.h>
#include "chat.h"

using std::string;

class ChatUserI : public Chat::MessageReceiver {
public:
virtual void onMessage(const string& user, const string& message, const Ice::Current&) {
std::cout << user << " : " << message << std::endl;
}
};

class Client : public Ice::Application {
public:
virtual int run(int argc, char* argv[]) {
Chat::RoomPrx chatRoom = Chat::RoomPrx::checkedCast(
communicator()->stringToProxy("Chat.Room:default -p 10000"));
if (!chatRoom) {
std::cout << "Proxy not existed!\n";
return -1;
}

Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapterWithEndpoints(
"Chat.UserAdapter", "default");
Chat::MessageReceiverPtr user = new ChatUserI;
adapter->add(user, communicator()->stringToIdentity("Chat.User"));
adapter->activate();

Chat::MessageReceiverPrx userPrx = Chat::MessageReceiverPrx::uncheckedCast(
adapter->createProxy(communicator()->stringToIdentity("Chat.User")));

string name;
std::cout << "Please input user name: ";
std::cin >> name;
if (!chatRoom->login(name, userPrx)) {
std::cout << "login error: User Name already exist!\n";
return 0;
}
std::cout << "login OK!" << std::endl;

string message;
while (std::getline(std::cin, message) && message != "quit") {
chatRoom->sendMessage(name, message);
}

chatRoom->logout(name);

return 0;
}
};

int main(int argc, char* argv[]) {
Client app;
return app.main(argc, argv);
}

结果运行起来报错!
...全文
455 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kastolo 2013-11-21
  • 打赏
  • 举报
回复
原因肯定是LIB连接问题,你试着更换一下LIB目录 C:\Program Files (x86)\ZeroC\Ice-3.5.1\lib\vc110
rockhuman 2012-05-23
  • 打赏
  • 举报
回复
我也碰到了这个问题,我是这样解决的。项目属性->配置属性->链接器->输入->附加依赖项,把iced.lib写上去,链接错误消失。
rockhuman 2012-05-23
  • 打赏
  • 举报
回复
我也碰到了这个问题,我是这样解决的。项目属性->配置属性->链接器->输入->附加依赖项,把iced.lib写上去,链接错误消失。
wll1009 2011-09-08
  • 打赏
  • 举报
回复
这个问题是怎么解决的?我也出现了同样的问题,我把iced.lib和iceutild.lib都添加了呀
热爱生活 2011-05-10
  • 打赏
  • 举报
回复
等好心人帮忙!实在没有办法了。。。
热爱生活 2011-05-09
  • 打赏
  • 举报
回复
还有没有人,指教一下!问题还没有解决啊!
热爱生活 2011-05-08
  • 打赏
  • 举报
回复
我已经把库加进去了啊?
cnhome 2011-05-07
  • 打赏
  • 举报
回复
应该是类库不对,另外你这个程序,非线程安全,跑起来会出问题
大熊猫侯佩 2011-05-07
  • 打赏
  • 举报
回复
库没连接
roeast 2011-05-07
  • 打赏
  • 举报
回复
没把lib依赖库加进来
热爱生活 2011-05-06
  • 打赏
  • 举报
回复

server.cpp
1>c:\documents and settings\ateng\server.cpp(52) : warning C4101: “ex”: 未引用的局部变量
1>正在链接...
1>server.obj : error LNK2019: 无法解析的外部符号 "private: void __thiscall IceProxy::Chat::MessageReceiver::onMessage(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > const *)" (?onMessage@MessageReceiver@Chat@IceProxy@@AAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0PBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@std@@@2@@5@@Z),该符号在函数 "public: void __thiscall IceProxy::Chat::MessageReceiver::onMessage(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?onMessage@MessageReceiver@Chat@IceProxy@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0@Z) 中被引用
1>server.obj : error LNK2001: 无法解析的外部符号 "public: virtual bool __thiscall Chat::Room::ice_isA(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,struct Ice::Current const &)const " (?ice_isA@Room@Chat@@UBE_NABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABUCurrent@Ice@@@Z)
1>server.obj : error LNK2001: 无法解析的外部符号 "public: virtual class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > __thiscall Chat::Room::ice_ids(struct Ice::Current const &)const " (?ice_ids@Room@Chat@@UBE?AV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@ABUCurrent@Ice@@@Z)
1>server.obj : error LNK2001: 无法解析的外部符号 "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const & __thiscall Chat::Room::ice_id(struct Ice::Current const &)const " (?ice_id@Room@Chat@@UBEABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABUCurrent@Ice@@@Z)
1>server.obj : error LNK2001: 无法解析的外部符号 "public: virtual class IceInternal::Handle<class Ice::Object> __thiscall Chat::Room::ice_clone(void)const " (?ice_clone@Room@Chat@@UBE?AV?$Handle@VObject@Ice@@@IceInternal@@XZ)
1>server.obj : error LNK2001: 无法解析的外部符号 "public: virtual enum Ice::DispatchStatus __thiscall Chat::Room::__dispatch(class IceInternal::Incoming &,struct Ice::Current const &)" (?__dispatch@Room@Chat@@UAE?AW4DispatchStatus@Ice@@AAVIncoming@IceInternal@@ABUCurrent@4@@Z)
1>server.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __thiscall Chat::Room::__write(class IceInternal::Handle<class Ice::OutputStream> const &)const " (?__write@Room@Chat@@UBEXABV?$Handle@VOutputStream@Ice@@@IceInternal@@@Z)
1>server.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __thiscall Chat::Room::__write(class IceInternal::BasicStream *)const " (?__write@Room@Chat@@UBEXPAVBasicStream@IceInternal@@@Z)
1>server.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __thiscall Chat::Room::__read(class IceInternal::Handle<class Ice::InputStream> const &,bool)" (?__read@Room@Chat@@UAEXABV?$Handle@VInputStream@Ice@@@IceInternal@@_N@Z)
1>server.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __thiscall Chat::Room::__read(class IceInternal::BasicStream *,bool)" (?__read@Room@Chat@@UAEXPAVBasicStream@IceInternal@@_N@Z)
1>server.obj : error LNK2019: 无法解析的外部符号 "class IceProxy::Ice::Object * __cdecl IceInternal::upCast(class IceProxy::Chat::MessageReceiver *)" (?upCast@IceInternal@@YAPAVObject@Ice@IceProxy@@PAVMessageReceiver@Chat@4@@Z),该符号在函数 "public: __thiscall IceInternal::ProxyHandle<class IceProxy::Chat::MessageReceiver>::~ProxyHandle<class IceProxy::Chat::MessageReceiver>(void)" (??1?$ProxyHandle@VMessageReceiver@Chat@IceProxy@@@IceInternal@@QAE@XZ) 中被引用
1>server.obj : error LNK2019: 无法解析的外部符号 "class Ice::Object * __cdecl IceInternal::upCast(class Chat::Room *)" (?upCast@IceInternal@@YAPAVObject@Ice@@PAVRoom@Chat@@@Z),该符号在函数 "public: __thiscall IceInternal::Handle<class Chat::Room>::Handle<class Chat::Room>(class Chat::Room *)" (??0?$Handle@VRoom@Chat@@@IceInternal@@QAE@PAVRoom@Chat@@@Z) 中被引用
1>server.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall IceStorm::LinkExists::LinkExists(void)" (__imp_??0LinkExists@IceStorm@@QAE@XZ),该符号在函数 "void __cdecl IceStorm::`dynamic initializer for '__LinkExists_init''(void)" (??__E__LinkExists_init@IceStorm@@YAXXZ) 中被引用
1>server.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall IceStorm::LinkExists::~LinkExists(void)" (__imp_??1LinkExists@IceStorm@@UAE@XZ),该符号在函数 "void __cdecl IceStorm::`dynamic atexit destructor for '__LinkExists_init''(void)" (??__F__LinkExists_init@IceStorm@@YAXXZ) 中被引用
1>F:\c++编程\编程存储\icechat\sever.cpp\Debug\ice.exe : fatal error LNK1120: 14 个无法解析的外部命令



该加的库我都加进去了啊??哪位高手指点一下!

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧