带有 ZeroC Ice 3.5.1 的 c++ clr
c++ clr with ZeroC Ice 3.5.1
我需要使用 C++ clr 编译使用 ZeroC 的 ICE 生成的现有消息库。
我已经做了一段时间了,但运气不好。
我定义了一个非常简单的 .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 的惯例,我必须 link 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不熟悉造成的。
任何帮助将不胜感激。
我的项目迁移到 vs 2013 后遇到了同样的问题。
用ice编译的c++项目没问题
但是项目 c++/cli with ice 没有链接。
我修复了 ObjectFactoryManagerF.h 中的链接问题:
#ifdef __cplusplus_cli
IceUtil::Shared* upCast(ObjectFactoryManager* p) { return (IceUtil::Shared*) p; };
#else
IceUtil::Shared* upCast(ObjectFactoryManager* );
#endif
在他们的论坛 here 上看到他们不支持 C++/CLI 和 ICE 生成的代码后,我不再尝试让它们一起工作。
我做了什么.. 我已经在我有 C++/CLI 的客户端创建了本机静态库。静态库完全封装了所有通信内容,并从 C++/CLI 部分引用。结果,我得到了一个 Mixed (C++/CLR) Recommended Rules 程序集。它工作正常,而且我有更简单的便携式应用程序。
我需要使用 C++ clr 编译使用 ZeroC 的 ICE 生成的现有消息库。
我已经做了一段时间了,但运气不好。
我定义了一个非常简单的 .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 的惯例,我必须 link 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不熟悉造成的。 任何帮助将不胜感激。
我的项目迁移到 vs 2013 后遇到了同样的问题。
用ice编译的c++项目没问题 但是项目 c++/cli with ice 没有链接。
我修复了 ObjectFactoryManagerF.h 中的链接问题:
#ifdef __cplusplus_cli
IceUtil::Shared* upCast(ObjectFactoryManager* p) { return (IceUtil::Shared*) p; };
#else
IceUtil::Shared* upCast(ObjectFactoryManager* );
#endif
在他们的论坛 here 上看到他们不支持 C++/CLI 和 ICE 生成的代码后,我不再尝试让它们一起工作。 我做了什么.. 我已经在我有 C++/CLI 的客户端创建了本机静态库。静态库完全封装了所有通信内容,并从 C++/CLI 部分引用。结果,我得到了一个 Mixed (C++/CLR) Recommended Rules 程序集。它工作正常,而且我有更简单的便携式应用程序。