НЕТ экспорта символов в библиотеке, созданной из Corba IDL в VC

Два файла IDL, testbase.idl

module Test{
   enum JobType{
       TYPE1,
        TYPE2,
       TYPE3
   };

   struct UserContext{
       string name;
       string ssoToken;
   };
};

testhello.idl:

#include "testbase.idl"
module Test 
{
   interface Hello
   {
    void createJob(in UserContext type);
   };
};

и содержимое Hello.mpc:

project(testbaseIDL): taoidldefaults, anytypecode {
      idlflags += -Wb,stub_export_macro=TEST_BASE_STUB_Export -Wb,stub_export_include=test_base_stub_export.h -Wb,skel_export_macro=TEST_BASE_SKEL_Export -Wb,skel_export_include=test_base_skel_export.h
      IDL_Files {
          testhello.idl
      }
  custom_only = 1
}

project(testhelloIDL): taoidldefaults, anytypecode {
     idlflags   += -Wb,stub_export_macro=TEST_HELLO_STUB_Export -Wb,stub_export_include=test_hello_stub_export.h -Wb,skel_export_macro=TEST_HELLO_SKEL_Export -Wb,skel_export_include=test_hello_skel_export.h
      IDL_Files {
          testhello.idl
      }
  custom_only = 1
}

project(test_base_server): naming, iortable, utils, avoids_corba_e_micro, anytypecode {
    sharedname = test_base_server
    after += *IDL
    Source_Files {
          testbaseS.cpp
    }
   Header_Files{
   testbaseS.h
        testbaseC.h
test_base_skel_export.h 
    }

  dynamicflags += TEST_BASE_SKEL_BUILD_DLL TEST_BASE_STUB_BUILD_DLL
  }

project(test_base_client): naming, iortable, utils,anytypecode {
   sharedname = test_base_client
   dynamicflags += TEST_BASE_STUB_BUILD_DLL
   Source_Files {
        testbaseC.cpp
   }
   Header_Files{
       test_base_stub_export.h 
   testbaseC.h
   }
 }

 project(testhelloserver): naming, iortable, utils, avoids_corba_e_micro,anytypecode {
     sharedname = test_hello_server
     dynamicflags += TEST_HELLO_SKEL_BUILD_DLL
     libs += test_base_server test_hello_client test_base_client
     Source_Files {
           testhelloS.cpp
     }
    Header_Files{
     testhelloS.h
         testbaseS.h
        test_hello_skel_export.h
   }

  }

 project(testhelloclient): naming, iortable, utils,anytypecode {
         sharedname = test_hello_client
         dynamicflags += TEST_HELLO_STUB_BUILD_DLL
         libs += test_base_client
        Source_Files {
              testhelloC.cpp
        }
      Header_Files{
         testhelloC.h
        testbaseC.h
        test_hello_stub_export.h
      }
  }

Я хочу сделать демо. MPC будет генерировать 4 основных проекта (testbaseClient, testbaseserver, testhelloServer и testhelloClient), и каждый проект будет генерировать одну DLL и библиотеку, и все они будут использоваться в качестве каркаса и заглушки для каждого IDL.

В VS2008 после создания testUDL, testbaseclient, testbaseServer, ссылки как для testbaseserver, так и для testbaseclient завершаются ошибкой, так как ссылка не может найти некоторые символы. Сообщения об ошибках:

1> testhelloC.obj: ошибка LNK2019: неразрешенный внешний символ "оператор bool __cdecl:: маршал (класс TAO_OutputCDR &)" (? Marshal@?$In_Var_Size_Argument_T@UUserContext@Test@@VAny_Insert_Policy_Stream@TAO@ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @ TAO @@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ too @Z)
1>testhelloC.obj: ошибка LNK2019: неразрешенный внешний символ "void __cdecl operator::any_insert(класс CORBA::Any *,struct Test::UserContext const &)" (? Any_insert@?$Any_Insert_Policy_Stream@UUserContext@Test@@@TAO@@SAXPAVAny@CORBA@@ABUUserContext@Test@@@Z)
1>testhelloS.obj: ошибка LNK2001: неразрешенный внешний символ "void __cdecl operatortesthelloS.obj: ошибка LNK2019: неразрешенный внешний символ" оператор bool __cdecl >>(класс TAO_InputCDR &,struct Test::UserContext &)" (??5@YA_NAAVTAO_Input) @@AAUUserContext@Test@@@Z), на который ссылается функция "public: virtual bool __thiscall TAO::In_Var_Size_SArgument_T::demarshal(класс TAO_InputCDR &)" (? Demarshal@?$In_Var_Size_SArgument_T@ @ T ест @ Tao @@UAE_NAAVTAO_InputCDR@@@Z)
1>.\ Test_hello_serverd.dll: фатальная ошибка LNK1120: 3 неразрешенных внешних кода

Я понимаю ошибку: неразрешенный внешний символ возникает, только если ссылка не может найти этот символ из себя или зависимых библиотек. Поэтому я добавил libs += test_base_server test_base_client для testhelloclient и testhelloserver. После восстановления всего проекта результат тот же. "Неразрешенный внешний символ" все еще существует.

Я подозреваю, что две сгенерированные базовые библиотеки неверны, и я использую команду: dumpbin /EXPORTS, чтобы экспортировать весь символ, и там не было ни одного сообщенного неразрешенного внешнего символа.

Microsoft (R) COFF/PE Dumper Версия 9.00.30729.01
Copyright (C) Microsoft Corporation. Все права защищены. Дамп файла test_base_clientd.dll Тип файла: DLL Раздел содержит следующие экспорты для test_base_clientd.dll 00000000 характеристик 526C30F9 отметка времени даты сб 26 октября 18:15:37 2013 версия 1 порядковая база 1 число функций 1 количество имен порядковый номер подсказки RVA имя 1    0 00003130??4_Init_locks@std@@QAEAAV01@ABV01@@Z =??4_Init_locks@std@@QAEAAV01@ABV01@@Z (общедоступный: класс std::_Init_locks & __thiscall std::_Init_locks::operator=(class std::_Init_locks const &)) Сводка 1000 .data
        2000 .idata
        3000 .rdata
        1000 .reloc
        1000 .rsrc
        9000 .text
Microsoft (R) COFF/PE Dumper Версия 9.00.30729.01
Copyright (C) Microsoft Corporation. Все права защищены. Дамп файла test_base_serverd.dll Тип файла: DLL Раздел содержит следующие экспорты для test_base_serverd.dll

    00000000 характеристик 526C2AEE отметка времени даты сб 26 октября 17:49:50 2013
        0,00 версия 1 порядковый номер 1 количество функций 1 количество имен порядковый номер подсказки RVA имя 1    0 00003130??4_Init_locks@std@@QAEAAV01@ABV01@@Z =??4_Init_locks@std@@QAEAAV01@ABV01@@Z (общедоступный: класс std::_Init_locks & __thiscall std::_Init_locks::operator=(class std::_Init_locks const &)) Сводка 1000 .data
        2000 .idata
        3000 .rdata
        1000 .reloc
        1000 .rsrc
        9000 .text
Microsoft (R) COFF/PE Dumper Версия 9.00.30729.01
Copyright (C) Microsoft Corporation. Все права защищены. Дамп файла test_base_serverd.lib Тип файла: LIBRARY Экспортирует порядковое имя??4_Init_locks@std@@QAEAAV01@ABV01@@Z (public: class std::_Init_locks & __thiscall std::_Init_locks::operator=(класс std:: _ Init_locks) const &)) Сводная информация E1 .debug$S
          14 .idata$2
          14 .idata$3
           4 .idata$4
           4 .idata$5
          16 .idata$6 Дампер Microsoft (R) COFF/PE Версия 9.00.30729.01
Copyright (C) Microsoft Corporation. Все права защищены. Дамп файла test_base_clientd.lib Тип файла: LIBRARY Экспортирует порядковое имя??4_Init_locks@std@@QAEAAV01@ABV01@@Z (public: class std::_Init_locks & __thiscall std::_Init_locks::operator=(класс std:: _ Init_locks) const &))

  Summary

          E1 .debug$S
          14 .idata$2
          14 .idata$3
           4 .idata$4
           4 .idata$5
          16 .idata$6

Тогда меня смущает то, что: 1) Для ссылки требуется весь символ, доступный во время создания библиотечного проекта. Мой предыдущий опыт работы с Unix заключается в том, что все символы требуются только в том случае, если они используются для создания исполняемого файла.

2) Как решить эту проблему здесь? Должен ли я добавить некоторые аргументы для проектов testIDL?

[Обновить]:

Добавлены все *C.cpp для testhelloclient, и все *C.cpp и *S.cpp будут выполнять компиляцию.

Однако это не так, как я ожидал. Я хочу скомпилировать каждый IDL в две библиотеки: одна для заглушки, а другая для скелета. Затем в будущем мне нужно только поставить заглушку / скелет с соответствующими заголовочными файлами для других проектов. Скелетному / подчиненному приложению не нужно компилировать любой из cpp-файлов, сгенерированных IDL, когда доступны.lib /.dll и заголовочный файл.

В настоящее время ни один из файлов *.lib, сгенерированных выше, не содержит символов из *C.cpp или *S.cpp(результат создания дампа похож на предыдущий, только 1 функция). А другое приложение будет по-прежнему сообщать о неразрешенных символах, потому что.lib не содержит символов экспорта.

Я прочитал MSDN: http://msdn.microsoft.com/en-us/library/ms235636%28v=vs.90%29.aspx сегодня днем. Для символа экспорта dll, функция объявлена ​​как:

static __declspec(dllexport) double Add(double a, double b);

но сгенерированные idl c заголовочные файлы, похоже, не следуют этому пути..

VC, кажется, сильно отличается от GCC в Linux. Есть ли какое-то решение? Невозможно добавить _declsepc для каждой функции в сгенерированных IDL заголовочных файлах? Проблема упрощается следующим образом: ни один из символов не экспортируется в библиотеку, сгенерированную из IDL в VC(я переименовал название для более ясного понимания)

[Далее обновление] Я возвращаюсь к команде tao_idl, кажется, это вызвано такими параметрами, как: -Wb,skeleton_export_include="headerfile.h" export_macro..

Кажется, все эти файлы и макросы сгенерированы.... Есть ли какой-нибудь лучший файл с расширением.mpc и это headerfile.h и макросы?

[ОБНОВЛЕНИЕ] Теперь он работает с обновленным файлом mpc (см. Выше). Файлы экспорта генерируются с помощью generate_export_file.pl, который находится в каталоге $ACE_ROOT/bin. Команда выглядит так:

generate_export_file.pl TEST_HELLO_STUB > test_hello_stub_export.h

Спасибо всем.

1 ответ

Решение

Вы должны добавить anytypecode также в качестве базового проекта в других проектах в файле IDL, а не только с самим файлом IDL. Также просто используйте именование вместо namingexe, вам нужно использовать только заглушки службы имен, а не полную реализацию сервиса

Другие вопросы по тегам