dll作成時のリンクエラー

解決


puel  2003-05-23 05:59:41  No: 51460

ユーザーからもらった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-23 08:18:22  No: 51461

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

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


puel  2003-05-23 19:47:26  No: 51462

回答ありがとうございます。
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 21:25:33  No: 51463

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

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

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


puel  2003-05-23 23:30:25  No: 51464

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


YuO  2003-05-24 00:24:23  No: 51465

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

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

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

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


puel  2003-05-24 01:02:40  No: 51466

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加