【问题标题】:c++ clr with ZeroC Ice 3.5.1c++ clr with ZeroC Ice 3.5.1
【发布时间】:2015-02-03 20:44:46
【问题描述】:

我需要编译使用 ZeroC 的 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 不熟悉造成的。 任何帮助将不胜感激。

【问题讨论】:

  • 该语言称为C++/CLI。 CLR 是运行时环境。
  • 好的。编译器选项是 /clr 对吧?
  • 天哪,模板链接错误。你必须看到光明的一面。当你弄清楚这一点时,你永远不会再把名字弄错了。塑造性格的东西。

标签: c++-cli ice


【解决方案1】:

将我的项目迁移到 vs 2013 后,我遇到了同样的问题。

带有ice的c++项目编译正常 但是带有 ice 的项目 c++/cli 没有链接。

我修复了 ObjectFactoryManagerF.h 中的链接问题:

#ifdef __cplusplus_cli
IceUtil::Shared* upCast(ObjectFactoryManager* p) { return (IceUtil::Shared*) p; };
#else
IceUtil::Shared* upCast(ObjectFactoryManager* );
#endif

【讨论】:

    【解决方案2】:

    我在他们的论坛here 上读到他们不支持 C++/CLI 和 ICE 生成的代码后,我不再尝试让它们一起工作。 我做了什么.. 我在客户端创建了本地静态库,我有 C++/CLI。静态库完全封装了所有通信内容,并从 C++/CLI 部分引用。结果,我得到了一个混合 (C++/CLR) 推荐规则 程序集。它工作得很好,而且我有更容易的便携式应用程序。

    【讨论】:

      猜你喜欢
      • 2011-12-03
      • 2017-11-16
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 2020-08-08
      • 1970-01-01
      • 2012-08-19
      相关资源
      最近更新 更多