操作
バグ #2138
完了Windows版でComponentObserverが動作しない
開始日:
2011/05/25
期日:
進捗率:
100%
予定工数:
説明
Windows版でComponentObserverが動作しない
n-ando さんが14年以上前に更新
- 進捗率 を 0 から 30 に変更
- omniORBのスタブ生成、コンパイル時に、シンボルの扱いに気を付ける必要がある。
http://omniorb.sourceforge.net/omni41/omniORB/omniORB012.html
ComponentObserver.idl はSDOPackage.idl をインクルードしているので、SDOPackageのシンボルに対してはUSE_stub_in_nt_dllを有効にしてシンボル等をimportする必要がある。一方ComponentObserver.idlで定義されているシンボルはUSE_stub_in_nt_dllを無効にする必要がある。
- omniidl のオプションに -Wbdll_includes を付ける。
- INCLUDED_stub_in_nt_dll をプリプロセッサで定義する
これにより、シンボルの参照が正しく行われるようになった。
n-ando さんが14年以上前に更新
- coil::Factory, coil::Singleton にDLL_PLUGINマクロ(dllexport/dllimpoerを切り替える)を追加
- explicit instantiation をする以下の1行をSdoServiceAdminに追加
template class DLL_PLUGIN ::coil::GlobalFactory< ::RTC::SdoServiceConsumerBase >;
効果なし。
dumpbin /EXPORTS rtc110d.dll |grep addFactory|grep SdoService
とやっても何もなし。Factory関係の関数がexportされていない。
n-ando さんが14年以上前に更新
Factoryの実体化のために実際にSdoServiceConsumerのファクトリを使用するダミーコードを追加。
class DummySdoService
: public RTC::SdoServiceConsumerBase
{
public:
virtual bool init(RTC::RTObject_impl& rtobj,
const SDOPackage::ServiceProfile& profile){ return true;}
virtual bool reinit(const SDOPackage::ServiceProfile& profile) {return true;}
virtual const SDOPackage::ServiceProfile& getProfile() const { return SDOPackage::ServiceProfile(); }
virtual void finalize() {}
};
void DummySdoServiceInit()
{
RTC::SdoServiceConsumerFactory& factory
= RTC::SdoServiceConsumerFactory::instance();
factory.addFactory("dummy",
::coil::Creator< ::RTC::SdoServiceConsumerBase,
DummySdoService>,
::coil::Destructor< ::RTC::SdoServiceConsumerBase,
DummySdoService>);
factory.removeFactory("dummy");
std::cout << "DummySdoServiceInit()" << std::endl;
}
とりあえず、関数はexportsされている。
H:\work\trunk\OpenRTM-aist\win32\OpenRTM-aist\bin>dumpbin /EXPORTS RTC110d.dll |
grep addFactory|grep SdoService
8489 2128 0016FA67 ?addFactory@?$Factory@VSdoServiceConsumerBase@RTC@@V?$
basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$less@V?$basic_stri
ng@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@4@P6APAV12@XZP6AXAAPAV12@@Z@co
il@@QAE?AW4ReturnCode@12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D
@2@@std@@P6APAVSdoServiceConsumerBase@RTC@@XZP6AXAAPAV67@@Z@Z = @ILT+31330(?addF
actory@?$Factory@VSdoServiceConsumerBase@RTC@@V?$basic_string@DU?$char_traits@D@
std@@V?$allocator@D@2@@std@@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$al
locator@D@2@@std@@@4@P6APAV12@XZP6AXAAPAV12@@Z@coil@@QAE?AW4ReturnCode@12@ABV?$b
asic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@P6APAVSdoServiceConsum
erBase@RTC@@XZP6AXAAPAV67@@Z@Z)
n-ando さんが14年以上前に更新
- 進捗率 を 30 から 50 に変更
実験
void DummySdoServiceInit()
{
RTC::SdoServiceConsumerFactory& factory
= RTC::SdoServiceConsumerFactory::instance();
// ここから
factory.addFactory("dummy",
::coil::Creator< ::RTC::SdoServiceConsumerBase,
DummySdoService>,
::coil::Destructor< ::RTC::SdoServiceConsumerBase,
DummySdoService>);
factory.removeFactory("dummy");
std::cout << "DummySdoServiceInit()" << std::endl;
// ここまで
}
- ここから・ここまでをコメントイン: addfactoryのExportシンボルあり
- ここから・ここまでをコメントアウト: addfactoryのExportシンボルなし
使用した関数のみ実体化されそれらがexportされる。
また、template class DLL_PLUGIN ::coil::GlobalFactory< ::RTC::SdoServiceConsumerBase >;
を削除したが、関数はExportされる。RTC.DLLはdumpbinでシンボルを引っ張り出して
すべてのシンボルをexportしているので関係ないみたい。
n-ando さんが14年以上前に更新
- ステータス を 新規 から 終了 に変更
- 進捗率 を 50 から 100 に変更
- DummySdoServiceInit() は不要なことが判明
- INCLUDE_stub_nt_dll と -Wbdll_include を追加
- SdoServiceConsumerBaseのvirtualデストラクタが抜けていたため、オブジェクトが解体されずタイマー等が動き続け落ちていた(Observer削除時)
- explicit instantiation は必要、EXTERNも追加しヘッダに記載
EXTERN template class DLL_PLUGIN ::coil::GlobalFactory< ::RTC::SdoServiceConsumerBase >;
以上でほぼ落ちなくなったので解決とする。
操作