c ++ clr с ZeroC Ice 3.5.1

Мне нужно скомпилировать существующую библиотеку сообщений, созданную с помощью 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. Любая помощь будет оценена.


person sbrett    schedule 03.02.2015    source источник
comment
Этот язык называется C ++ / CLI. CLR - это среда выполнения.   -  person IInspectable    schedule 03.02.2015
comment
В порядке. Параметр компилятора - / clr, верно?   -  person sbrett    schedule 03.02.2015
comment
Ой, ошибки связывания шаблонов. Вы должны смотреть на светлую сторону. К тому времени, как вы это поймете, вы больше никогда не ошибетесь в названии. Материал для построения персонажей.   -  person Hans Passant    schedule 04.02.2015


Ответы (2)


У меня была такая же проблема после переноса моих проектов на vs 2013.

Проект c ++ со льдом компилируется нормально, но проект c ++ / cli со льдом не связывается.

Я исправил проблему связывания в ObjectFactoryManagerF.h:

#ifdef __cplusplus_cli
IceUtil::Shared* upCast(ObjectFactoryManager* p) { return (IceUtil::Shared*) p; };
#else
IceUtil::Shared* upCast(ObjectFactoryManager* );
#endif
person ahmed hamaied    schedule 11.02.2015

Я перестал пытаться заставить C ++ / CLI и созданный ICE код работать вместе после того, как прочитал на их форуме здесь, что они его не поддерживают. Что я сделал ... Я создал статическую библиотеку на стороне клиента, где у меня был C ++ / CLI. Статическая библиотека полностью инкапсулирует все коммуникации и ссылается на C ++ / CLI. В результате у меня есть сборка смешанных (C ++ / CLR) рекомендуемых правил. Он отлично работает, плюс у меня есть более простое портативное приложение.

person Syb3rian    schedule 24.02.2015