[openrtm-users 00979] Win32 DLL でのRTC利用 RTC Builderの生成コードについて

1 post / 0 new
root
Offline
Last seen: 1 day 55 min ago
Joined: 2009-06-23 14:31
[openrtm-users 00979] Win32 DLL でのRTC利用 RTC Builderの生成コードについて

OpenRTM-aist開発者の皆さま:
お世話になっております.早大の菅です.

RTCをWin32 DLLとして利用する際に,RTCBuilderの生成する
プロジェクトファイルの設定について意見があり
メールを差し上げました.

慣れでやっているので古い情報かもしれません.
詳しい方がいらっしゃったらフォローをくださるとありがたいと思っています.

問題は2点です.
■DLLのEXPORT定義が無いためDLLが使えない
■DLLのファイル名がDebugでもReleaseでも同じなので不便

以下に詳しく示します.

■DLLのEXPORT定義が無いためDLLが使えない

DLLとしてRTCを生成する際にDLLをロードした実行ファイルから
○○Init関数(○○はコンポーネント名)を実行するのが
DLL版RTCの基本的な使い方かと思います.

そしてDLLを記述する際に,○○Init関数をExportする設定を
「モジュール定義ファイル(*.def)」で行うか,
Init関数の宣言方法を
__declspec(dllexport)
をつけて宣言する必要があると思います.
つまりヘッダの宣言部を

extern "C"
{
void __declspec(dllexport) PeriodicDataInInit(RTC::Manager* manager);
};

とします.

しかし,現状ではRTC Builderが生成したコードをそのまま
コンパイルしてもDLLは使えないままになっていると思います.
(間違っていたら使用法を教えていただけませんでしょうか)

.defファイルを使う方が簡単です.
プロジェクトにモジュール定義ファイルの部分を追加して,
defファイルを同時に生成してください.
defファイルの内容は
LIBRARY "○○"
EXPORTS ○○InInit
の2行で十分だと思います.

ただ後者の関数宣言をいじる方が暗黙的利用(○○.libをリンクして,
ヘッダファイルで宣言された関数を再利用する)
が使えるらしいので便利です(まだ試していません)
WIN32のマクロを使えば可能かと思います(これもまだ).

■DLLのファイル名がDebugでもReleaseでも同じなので不便

Debug,もしくはReleaseでコンパイルしても,
DLLの出力ファイルが同じ名前になっています.
これは不便です.

DebugでビルドしたDLLはRTC100d.dllに依存し,
ReleaseではRTC100.dllに依存していますが,
再利用する側のexeファイルで異なる側
(つまりDLLはDebugだが,exeはReleaseなど)
が使われていると,エラーを起こして実行できません.

できればRTC Builderで生成したプロジェクトファイルの時点で,
Debug側のDLL出力名を○○d.dllに変更していただけませんか?
この方が保守ははるかに便利です.

次回のアップでこのあたりの対応をお願いできませんか?
よろしくお願いします.

Undefined

Download

latest Releases : 2.0.0-RELESE

2.0.0-RELESE Download page

Number of Projects

Choreonoid

Motion editor/Dynamics simulator

OpenHRP3

Dynamics simulator

OpenRTP

Integrated Development Platform

AIST RTC collection

RT-Components collection by AIST

TORK

Tokyo Opensource Robotics Association

DAQ-Middleware

Middleware for DAQ (Data Aquisition) by KEK