我需要编译使用ZeroC&C的ICE和c ++ clr生成的现有消息库。
我已经有一段时间了,我没有运气。
我定义了一个非常简单的.ice消息文件。 在为此生成cpp和h文件后,我尝试将它们编译为.dll。 我的slice2cpp命令行参数是
C:\Program Files (x86)\ZeroC\Ice-3.5.1\bin\slice2cpp.exe --depend --dll-export=ENABLE_DLL -I"C:\Program Files (x86)\ZeroC\Ice-3.5.1\slice" -I".\.." --underscore "E:\test\platform\platform\testMessage.ice"
这会生成一个testMessage.cpp和testMessage.h文件。 在尝试编译这些时,我收到错误:
Error 7 error LNK2028: unresolved token (0A00098D) "class IceUtil::Shared * __cdecl IceInternal::upCast(class IceInternal::ObjectFactoryManager *)" (?upCast@IceInternal@@$$FYAPEAVShared@IceUtil@@PEAVObjectFactoryManager@1@@Z) referenced in function "public: __cdecl IceInternal::Handle<class IceInternal::ObjectFactoryManager>::Handle<class IceInternal::ObjectFactoryManager>(class IceInternal::Handle<class IceInternal::ObjectFactoryManager> const &)" (??0?$Handle@VObjectFactoryManager@IceInternal@@@IceInternal@@$$FQEAA@AEBV01@@Z) E:\test\platform\platform\testMessage.obj platform
与Ice一样,我必须链接Iced.lib和IceUtild.lib文件。 我编译时没有预编译的头文件和/ clr选项(不是纯粹的clr或安全) 使用VS2013。 testMessage.ice文件的主体非常简单。
#ifndef _MESSAGE_ICE_
#define _MESSAGE_ICE_
module messaging {
class Message
{
string clientId;
string origin;
string destination;
string messageType;
string suffix;
};
sequence<Message> MessageSeq;
class NonQueuedMsg extends messaging::Message {};
};
#endif
在没有CLR选项的情况下进行编译会导致成功。
我想这都是由于我对c ++ clr缺乏了解而造成的。 任何帮助将不胜感激。
答案 0 :(得分:2)
我的项目迁移到2013后,我遇到了同样的问题。
项目c ++与ice编译正常 但是带有冰的项目c ++ / cli没有链接。
我修复了ObjectFactoryManagerF.h中的链接问题:
#ifdef __cplusplus_cli
IceUtil::Shared* upCast(ObjectFactoryManager* p) { return (IceUtil::Shared*) p; };
#else
IceUtil::Shared* upCast(ObjectFactoryManager* );
#endif
答案 1 :(得分:0)
我在他们的论坛here上读到他们不支持它后,我停止尝试使C ++ / CLI和ICE生成的代码一起工作。 我做了什么..我在客户端使用C ++ / CLI创建了本机静态库。静态库完全封装了所有通信内容,并从C ++ / CLI部分引用。结果我得到了一个混合(C ++ / CLR)推荐规则程序集。它运行良好,我有更容易的便携式应用程序。