НЕТ экспорта символов в библиотеке, созданной из 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, вам нужно использовать только заглушки службы имен, а не полную реализацию сервиса