ユーザーからもらった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を指定するところが特に無いのですが、どこかで指定しないといけないのでしょうか?
よろしくお願いします。
aaa.h内のCalc_ULの宣言はどのようになっていますか?
#たぶん,そこが間違っている。
たぶん,正しい宣言は
#if defined(__cplusplus)
extern "C"
#endif
__declspec(dllimport) int __stdcall Calc_UL (struct ULData *);
になります。
回答ありがとうございます。
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);
で正しいでしょうか?
まず,ソフトウェアはexportするのではなくimportするのだから,
__declspec(dllexport)ではなく__declspec(dllimport)です。
intと__declspecの位置は,逆転していても問題ないです。
あと,リンケージ(C/C++)はあっていますか?
C++からCのプログラムを呼び出すときは,宣言にextern "C"が必要です。
aaa.hをextern "C"で囲んだらうまくゆきました。
つまり、aaa.dllはC++でなくCだったってことでしょうか?
int __declspec(dllexport) WINAPI Calc_UL(struct ULData *);
はexportのままですが大丈夫でしょうか。
> つまり、aaa.dllはC++でなくCだったってことでしょうか?
Cで書いたか,C++でextern "C"を付けていたかです。
C++でDLLを作っても,クラスとかでない限りextern "C"を付けることが多いです。
> int __declspec(dllexport) WINAPI Calc_UL(struct ULData *);
> はexportのままですが大丈夫でしょうか。
クラス以外については,どちらでも一緒みたいです。
失礼しました。
大変助かりました。クイックレスポンスも助かりました。
本当にありがとうございました。