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に変更していただけませんか? この方が保守ははるかに便利です.
次回のアップでこのあたりの対応をお願いできませんか? よろしくお願いします.
モーションエディタ/シミュレータ
動力学シミュレータ
統合開発プラットフォーム
産総研が提供するRTC集
東京オープンソースロボティクス協会
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
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に変更していただけませんか?
この方が保守ははるかに便利です.
次回のアップでこのあたりの対応をお願いできませんか?
よろしくお願いします.