[openrtm-users 00651] Re: dll用VC++プロジェクト生成について

Ando Noriaki n-ando @ aist.go.jp
2008年 11月 17日 (月) 15:49:11 JST


俵様

産総研 安藤です

お世話になっております。

> 産総研 知能システム研究部門 ヒューマノイド研究グループ
> にてお世話になっております俵です。
>
> Windows版のOpenRTM-aist-0.4.2-RELEASEのrtc-templateで
> dll用のVC++プロジェクトを生成する方法についてご教授願います。
>
> 具体例として
> http://www.openrtp.jp/openhrp3/jp/controller_pd.html
> にある「プログラミング 」「SamplePD.h 」の項目のような初期化関数
> SamplePDInit
> をエクスポートしたdllプロジェクトを作成したいのですが、現状rtc-template
> を用いてそのようなプロジェクトは自動生成可能でしょうか。
> 以上です。
> よろしくお願いします。

rtc-templateは0.4.2から実行ファイル用vcprojとDLL用vcproj、
それからそれらを統合するslnを生成します。

コンポーネント名 Sample としてrtc-templateでコードを生成すると、
Sample_vc[8|9].sln: ソリューションファイル
Sample_vc[8|9].vcproj: DLL用プロジェクトファイル
SampleComp_vc[8|9].vcproj: EXE用プロジェクトファイル
というファイルが生成されますので、slnをダブルクリックしてソリューション
を開いてください。DLLを作成する場合はSampleというプロジェクトをビルドしてください。

ただし、生成されるコードにはWindows用のコードとして一つまずい点があって、
DLLの初期化関数のexportがされていません。

Sample.h 内の
extern "C"
{
  void SampleInit(RTC::Manager* manager);
};
を
extern "C"
{
  DLL_EXPORT void SampleInit(RTC::Manager* manager);
};

に書き換えてからコンパイルするようお願いします。
DLL_EXPORTはRTC.hかどこかで定義されているマクロで、
Linuxでコンパイルしても副作用は出ないようになっています。

作成したDLLコンポーネントは、付属のrtcdコマンドでロードして
実行することができます。
以下のようなrtc.confをDLLと同じディレクトリに作成してください。

-- rtc.conf ---
corba.nameservers: xxx.xxx.xxx.xxx
naming.formats: %h.host_cxt/%n.rtc
logger.enable: YES
logger.log_level: PARANOID
manager.modules.load_path: .
manager.modules.preload: Sample.dll
manager.components.precreate: Sample

そのディレクトリで、

> "%RTM_ROOT%\bin\rtcd"

などと実行してください。
うまくいけば、DLLがロードされ、コンポーネントが1個作成されます。
logはこのようになるはずです

Nov 17 15:31:20 manager OpenRTM-aist-0.4.2
Nov 17 15:31:20 manager Copyright (C) 2003-2007
Nov 17 15:31:20 manager   Noriaki Ando
Nov 17 15:31:20 manager   Task-intelligence Research Group,
Nov 17 15:31:20 manager   Intelligent Systems Research Institute, AIST
Nov 17 15:31:20 manager Manager starting.
Nov 17 15:31:20 manager Starting local logging.
Nov 17 15:31:20 manager Manager::initORB()
Nov 17 15:31:20 manager Manager::initNaming()
Nov 17 15:31:20 manager Register Naming Server: corba/192.168.100.1
Nov 17 15:31:20 naming_svc NamingManager::registerNameServer(corba,
192.168.100.1)
Nov 17 15:31:20 manager Manager::getORB()
Nov 17 15:31:20 naming_svc NameServer connection succeeded: corba/192.168.100.1
Nov 17 15:31:20 manager Manager::initExecContext()
Nov 17 15:31:20 manager Manager::registerECFactory(PeriodicExecutionContext)
Nov 17 15:31:20 manager Manager::registerECFactory(ExtTrigExecutionContext)
Nov 17 15:31:20 manager Manager::registerECFactory(SynchExtTriggerEC)
Nov 17 15:31:20 manager Manager::activateManager()
Nov 17 15:31:20 manager Manager::getPOAManager()
Nov 17 15:31:20 manager Manager::registerFactory(Sample)
Nov 17 15:31:20 manager Manager::createComponent(Sample)
Nov 17 15:31:20 manager Manager::getORB()
Nov 17 15:31:20 manager Manager::getPOA()
Nov 17 15:31:20 manager Manager::getPOA()
Nov 17 15:31:20 manager Manager::getORB()
Nov 17 15:31:20 manager RTC created: Sample
Nov 17 15:31:20 manager RTC initialization succeeded: Sample
Nov 17 15:31:20 manager Manager::bindExecutionContext()
Nov 17 15:31:20 manager ExecutionContext type: PeriodicExecutionContext
Nov 17 15:31:20 manager Manager::registerComponent(Sample0)
Nov 17 15:31:20 manager Bind name: rtm01.host_cxt/Sample0.rtc
Nov 17 15:31:20 naming_svc NamingManager::bindObject(rtm01.host_cxt/Sample0.rtc)
Nov 17 15:31:20 manager Manager::runManager(): blocking mode



ちなみに、0.4.2のWindows版の
C:\Program Files\OpenRTM-aist\0.4\bin\rtcd
をその場で実行すると、サンプルコンポーネントDLLすべてを一つのプロセスで
ロードしてコンポーネントを一つづつ作成するようにrtc.confが設定されています。
詳しくは C:\Program Files\OpenRTM-aist\0.4\bin\rtc.conf をご覧ください。

-- 
安藤慶昭@独立行政法人産業技術総合研究所 研究員
                   知能システム研究部門 タスクインテリジェンス研究グループ
                   〒305-8568 茨城県つくば市梅園1-1-1 中央第2
                   TEL: 029-861-5981 FAX: 029-862-6631
                   n-ando @ aist.go.jp, n-ando @ ieee.org



openrtm-users メーリングリストの案内