小林です。

----- Original Message -----
From: "WATANABE Hirofumi" <eban / os.rim.or.jp>
Subject: [ruby-dev:10183] Re: don't use mktemp()


> 了解なんですけど, えっと, 毎回手で修正しなきゃいけないという
> のはなんか納得いかないというか人間のやる作業じゃないですよね.
> cygwin や mingw32 ではご存知のように全部 export という便利な
> 機能があったりしますが, VC++ にはそういう機能はないんでしょうか?
>
> なければ dumpbin(だっけ?)で symbol を取り出して整形して
> ruby.def を作るとか.
>

私は使ったことはないですが、以下のように宣言することで
.DEF ファイルを使わないようにできるようです。

# 宣言するという作業が依然としてあるので、せいぜい
# メンテするファイルが一つ減るくらいしかメリットは無いかも

以下ヘルプより(参考まで)
記憶クラス修飾子 dllimport と dllexport は C 言語に対する Microsoft の拡張機
能です。
これらの修飾子によって、DLL とクライアント (実行可能ファイルまたは別の DLL)
間
のインターフェイスを明示的に定義します。
関数を dllexport として宣言すると、モジュール定義 (.DEF) ファイルが必要なく
なります。
また、データとオブジェクトに対しても dllimport および dllexport を使うことが
できます。

次の例のように、記憶クラス修飾子 dllimport および dllexport は
拡張属性構文キーワード __declspec と一緒に使わなければなりません。

#define DllImport   __declspec( dllimport )
#define DllExport   __declspec( dllexport )

DllExport void func();
DllExport int i = 10;
DllExport int j;
DllExport int n;

ヘルプ終わり

ただし、機械的に全部エクスポートするのはカプセル化
という観点から考えるとどうでしょうか?

私は .DEF ファイルにより明示的に宣言しないとたとえ
 static 宣言していなくてもライブラリの外からは見えない
というアプローチは結構好きです。

UNIX で複数のソースファイルから一つの so ファイル
を作成するときには、ソースファイル間で見えるものは、
 so をロードしたものからも見えてしまいますが、これ
ではまることがあります。

とくに C++ ではクラス自体を static にできないので
同名のクラスを誤って定義したりして訳のわからない
ことが発生し、苦労したことがあります。

ここらへんは、皆さんどうされているのでしょうか?
何か良い方法があれば教えていただけるとありが
たいです。

小林 茂雄
shigeo / tinyforest.gr.jp