dll作成時のリンクエラー

解決


puel  2003-05-22 20:59:41  No: 51460  IP: [192.*.*.*]

ユーザーからもらったaaa.dllにある関数Calc_UL(struct型)をコールするbbb.dllを作成しようしています。 
コンパイルはとおるのですが、 dllのビルドがうまくいきません。ユーザーからはaaa.dllとaaa.libとaaa.hだけもらっており、aaa.libにはリンク設定をしています。 

bbb.obj : error LNK2001: 外部シンボル ""int __stdcall Calc_UL(struct ULData *)" (?Calc_UL@@YGHPAUULData@@@Z)" は未解決です 
Debug/bbb.dll : fatal error LNK1120: 外部参照 1 が未解決です。 
link.exe の実行エラー 

aaa.dllを指定するところが特に無いのですが、どこかで指定しないといけないのでしょうか? 
よろしくお願いします。

編集 削除
YuO  2003-05-22 23:18:22  No: 51461  IP: [192.*.*.*]

aaa.h内のCalc_ULの宣言はどのようになっていますか?
#たぶん,そこが間違っている。

たぶん,正しい宣言は
#if defined(__cplusplus)
extern "C"
#endif
__declspec(dllimport) int __stdcall Calc_UL (struct ULData *);
になります。

編集 削除
puel  2003-05-23 10:47:26  No: 51462  IP: [192.*.*.*]

回答ありがとうございます。
aaa.h内の関数は以下のようになってます。

#ifdef _WIN32
int __declspec(dllexport) WINAPI Calc_UL(struct ULData *);
#else
int     extern  Calc_UL(struct ULData *);
#endif

調べてて、戻り値intの位置がwebサイトにある例と異なるのが気になりますが。。。
これはaaa.h側のミスでしょうか?

また、呼び方は
ULData* ul
int r = Calc_UL(ul);
で正しいでしょうか?

編集 削除
YuO  2003-05-23 12:25:33  No: 51463  IP: [192.*.*.*]

まず,ソフトウェアはexportするのではなくimportするのだから,
__declspec(dllexport)ではなく__declspec(dllimport)です。

intと__declspecの位置は,逆転していても問題ないです。

あと,リンケージ(C/C++)はあっていますか?
C++からCのプログラムを呼び出すときは,宣言にextern "C"が必要です。

編集 削除
puel  2003-05-23 14:30:25  No: 51464  IP: [192.*.*.*]

aaa.hをextern "C"で囲んだらうまくゆきました。
つまり、aaa.dllはC++でなくCだったってことでしょうか?
int __declspec(dllexport) WINAPI Calc_UL(struct ULData *);
はexportのままですが大丈夫でしょうか。

編集 削除
YuO  2003-05-23 15:24:23  No: 51465  IP: [192.*.*.*]

> つまり、aaa.dllはC++でなくCだったってことでしょうか?

Cで書いたか,C++でextern "C"を付けていたかです。
C++でDLLを作っても,クラスとかでない限りextern "C"を付けることが多いです。


> int __declspec(dllexport) WINAPI Calc_UL(struct ULData *);
> はexportのままですが大丈夫でしょうか。

クラス以外については,どちらでも一緒みたいです。
失礼しました。

編集 削除
puel  2003-05-23 16:02:40  No: 51466  IP: [192.*.*.*]

大変助かりました。クイックレスポンスも助かりました。
本当にありがとうございました。

編集 削除