c++初心者です。
ユーザーからもらった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をインクルードしていればビルド出来そうな気がするんですが...。
やった事がないので、確かな事は言えませんが、他にやらなければいけない事があるんでしょう
か?
aaa.dllとbbb.dllのマングリングルールを同一にしていないのではないでしょうか。
双方が同じか否かを 下記項目毎に調べてみて下さい。
o C / C++ の装飾名生成 規則
o 呼び出し規約
回答ありがとうございます。
呼び出し規約は__cdecl __stdcall双方やってみたのですがだめでした。
C / C++ の装飾名生成 規則とはどこで確認すればよいのでしょうか。
よろしくお願いします。
それはそうと、解決したらこちらでもどう解決したか報告してくださいね
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200305/03050030.txt
>aaa.dllを指定するところが特に無いのですが、どこかで指定しないといけないのでしょう
不要です。この件では暗黙的リンクによるDLLの為です。
>呼び出し規約は__cdecl __stdcall双方やってみたのですがだめでした。
念のため、__fastcallも試してみて下さい。
>C / C++ の装飾名生成 規則とはどこで確認すればよいのでしょうか。
bbb.objはC++として(拡張子がcpp cxx ccのどれか)作られた物かどうかを確認して
みて下さい。
>bbb.objはC++として(拡張子がcpp cxx ccのどれか)作られた物かどうかを確認して
みて下さい。
つまり、aaa.dllのソースの拡張子がcppか・・・を確認すればよいのですね。
確認してみます。
>aaa.hをインクルードしていれば
aaa.hはインクルードしています。
引き続き何かありましたら、よろしくお願いします。
OK-web でも同じもの見かけた。
マルチポストはマナー違反です。
aaa.dllがC++でなくCだった場合、どうすればよいのでしょうか。
bbb.cppおよびbbb.hで if __cplusplus extern cで囲めばよいのでしょうか。
また関数のコール方法ですが、
ULData* dd;
Calc_UL(dd);
でよいのでしょうか。
あらかじめ問題はつぶしておきたく思います。よろしくお願いします。
>それはそうと、解決したらこちらでもどう解決したか報告してくださいね
>OK-web でも同じもの見かけた。マルチポストはマナー違反です。
すみません、回答があまりつかず、緊急で困っています。
解決したらすべてにきちんと書き込みます。
aaa.h を書き換えて:
#ifdef __cplusplus
extern C {
#endif
int Calc_UL(...);
#ifdef __cplusplus
}
#endif
とかやっとけば解決するんじゃないかしら。
> すみません、回答があまりつかず、緊急で困っています。
急を要する用事にはBBSは不向きです。
そもそもなぜに aaa の作者に相談しないんです?
επιστημηさん>
aaa.h を書き換えて:
#ifdef __cplusplus
extern C {
#endif
・・・
でうまくいきました。ありがとうございます!
ヘッダファイルのみの書き換えで大丈夫なんでしょうか?
ソースも書き換えなくて大丈夫なんですか?
> ソースも書き換えなくて大丈夫なんですか?
え?
> ユーザーからはaaa.dllとaaa.libとaaa.hだけもらっており、...
じゃないんですか?
στημηさん>
>> ユーザーからはaaa.dllとaaa.libとaaa.hだけもらっており、...
>>じゃないんですか?
そうです、つまり、ユーザーに書き換えてもらう必要があるか、ということです。
外部シンボルの整合を取るだけですから、re-compileの必要はないでしょう。
στημηさん>
本当に度々申し訳ありません。最後に教えてください。
・aaa.dllはCだったとうことですか?
・だとしたら、στημηさんはどうしてaaa.dllがCだとわかったのですか?
度々申し訳ありませんが、よろしくお願いします。