2 つの 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) を生成し、各プロジェクトは 1 つの dll とライブラリを生成し、それらすべてが各 IDL のスケルトンとスタブとして使用されます。
VS2008 では、testUDL、testbaseclient、testbaseServer をビルドした後、リンクがいくつかのシンボルを見つけることができないため、testbaseserver と testbaseclient の両方のリンクが失敗します。エラー メッセージは次のとおりです。
1>testhelloC.obj : エラー LNK2019: 未解決の外部シンボル "bool __cdecl operator::marshal(class TAO_OutputCDR &)" (?marshal@?$In_Var_Size_Argument_T@UUserContext@Test@@VAny_Insert_Policy_Stream@TAO@@@TAO@@UAE_NAAVTAO_OutputCDR@@ @Z) 1>testhelloC.obj: エラー LNK2019: 未解決の外部シンボル "void __cdecl operator::any_insert(class 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 operator>>(class TAO_InputCDR &,struct Test::UserContext &)" (??5@YA_NAAVTAO_InputCDR @@AAUUserContext@Test@@@Z) 関数 "public: virtual bool __thiscall TAO::In_Var_Size_SArgument_T::demarshal(class TAO_InputCDR &)" で参照 (?demarshal@?$In_Var_Size_SArgument_T@UUserContext@Test@@VAny_Insert_Policy_Stream@TAO@@ @TAO@@UAE_NAAVTAO_InputCDR@@@Z) 1>.\test_hello_serverd.dll: 致命的なエラー LNK1120: 3 つの未解決の外部
エラーを理解しました:未解決の外部シンボルは、リンク自体または依存ライブラリからそれらのシンボルが見つからなかった場合にのみ発生します。したがって、testhelloclient と testhelloserver の両方に libs += test_base_server test_base_client を追加しました。すべてのプロジェクトを再生成した後、結果は同じです。「未解決の外部シンボル」がまだ残っています。
生成された 2 つの基本ライブラリが間違っていると思われ、コマンドを使用します: 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 日時スタンプ 2013 年 10 月 26 日(土)18:15:37 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 .データ 2000 .idata 3000 .rdata 1000 .reloc 1000 .rsrc 9000 .テキスト Microsoft (R) COFF/PE Dumper バージョン 9.00.30729.01 Copyright (C) Microsoft Corporation. 全著作権所有。 ファイル test_base_serverd.dll のダンプ ファイルの種類: DLL セクションには、test_base_serverd.dll の次のエクスポートが含まれています 00000000の特徴 526C2AEE 日時スタンプ 2013 年 10 月 26 日 17:49:50 土 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 .データ 2000 .idata 3000 .rdata 1000 .reloc 1000 .rsrc 9000 .テキスト Microsoft (R) COFF/PE Dumper バージョン 9.00.30729.01 Copyright (C) Microsoft Corporation. 全著作権所有。 ファイル test_base_serverd.lib のダンプ ファイルの種類: ライブラリ 輸出 序数名 ??4_Init_locks@std@@QAEAAV01@ABV01@@Z (public: class std::_Init_locks & __thiscall std::_Init_locks::operator=(class 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 Dumper バージョン 9.00.30729.01 Copyright (C) Microsoft Corporation. 全著作権所有。 ファイル test_base_clientd.lib のダンプ ファイルの種類: ライブラリ 輸出 序数名 ??4_Init_locks@std@@QAEAAV01@ABV01@@Z (public: class std::_Init_locks & __thiscall std::_Init_locks::operator=(class std::_Init_locks const &)) 概要 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 を 2 つのライブラリにコンパイルしたいと考えています。1 つはスタブ用で、もう 1 つはスケルトン用です。その後、他のプロジェクトに対応するヘッダー ファイルを含むスタブ/スケルトンを提供するだけで済みます。.lib/.dll とヘッダーファイルが利用できる場合、IDL によって生成された cpp ファイルをスケルトン/サブアプリケーションでコンパイルする必要はありません。
現在、上記で生成された *.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 は、Linux の GCC とは大きく異なるようです。解決策はありますか?IDL で生成されたヘッダー ファイルの各関数に _declsepc を追加することはできませんか? この問題は次のように単純化されています: VC の IDL から生成されたライブラリにエクスポートされるシンボルはありません (より明確にするためにタイトルの名前を変更しました)
[追加更新] tao_idl コマンドに戻ります。次のようなオプションが原因のようです: -Wb,skeleton_export_include="headerfile.h" export_macro..
これらのファイルとマクロはすべて生成されているようです....生成された.mpcファイルに何か良いものはありますか?これらのheaderfile.hとマクロはありますか?
[更新] 更新された mpc ファイル (上記参照) で動作するようになりました。エクスポート ファイルは、$ACE_ROOT/bin ディレクトリにある generate_export_file.pl によって生成されます。コマンドは次のようになります。
generate_export_file.pl TEST_HELLO_STUB > test_hello_stub_export.h
皆さんありがとう。