- ベストアンサー
Vista 32bitでVisualStudio2008proを使って開発中に外部シンボルの未解決エラーが発生
- Vista 32bitでVisualStudio2008proを使って開発中に、外部シンボルの未解決エラーが発生しています。
- ヘッダーファイルとlibファイルをインクルードしてリンクしているにも関わらず、エラーLNK2001が解決されません。
- 64bit環境では問題なくコンパイルが通っているため、設定の問題ではないかと思っています。困っているので助けてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
あれ、一昨日補足したのが消えてるみたいです。 では、もう一度。 これはフォームのプログラムだったのですね。 そちらはあまり詳しくないのですが、/clrあたりが絡んでいるのかなあ。 設定を作り直したということは、もう以前の問題を再確認するのは無理でしょうね。 問題点が呼び出し規約にありそうというのは、たぶん間違いところですので、フォーム側とDLL側の設定や宣言を確認してみるのが先決かと。 その上で、Win64とWin32の違いを比較されるのが良いでしょう。
その他の回答 (3)
- osenbeyaketa
- ベストアンサー率75% (15/20)
__stdcall無しで上手く行くということは、呼び出される側が__cdeclだと思われます。 宣言が、上手く一致してないのでは。 Win32では、__cdeclに合わせることで動くようになったのでしょう。 Win64ですが、これまでの話しだとWin64では上手く行っていたように思っていたのですが、動かないのでしょうか?
お礼
確かに、DLLのソースを見ると、__stdcallは付いていませんでした。 しかし win64では、__stdcallがあれば動きます。 無いと“呼び出し規約が、メタデータに見つかりませんでした” と言われます。 win32では、__stdcallがあってもなくても、“外部シンボルが未解決”だと言われます。 (因みに設定を色々弄っていたので、最初から作り直しましたところ、呼び出し規約あっても無くても動きません。) libファイルは32と64で入れ替えているのですが…。 見比べていたら、 プリコンパイラの定義が違うと言う事は分かったのですが、これも原因になるのでしょうか?
補足
すいません、プリコンパイラの定義は同じでした、 そして、win64のコードを、win32でコンパイルしたところ、 error C2871: 'System' : この名前を指定された名前空間は存在しません。 c:\users\ks\desktop\csample\csample\Form1.h と言われてしまいました… もう意味が分かりません。
- osenbeyaketa
- ベストアンサー率75% (15/20)
__stdcallの方でしたか。(^^;) Win64の件を調べてみましたが、Win64ではレジスタ数が増えたので__stdcallのような呼び出し規約は無視されるみたいです。 つまり何を指定しても同じに扱うから、64bitではエラーが出なかったと。 こちらなど参考にどうぞ。 http://homepage1.nifty.com/herumi/prog/x64.html http://d.hatena.ne.jp/shiku_otomiya/20090518/p1
お礼
参考URLありがとうございます。(^^) 参考になりました。 しかし、 64bitでは、何で呼び出しても同じだと言うのならば、 x64では、__stdcallなしでも動きそうですが、 動かずにエラーになり、 なぜwin32では、呼び出し規約なしで動くのかが分かりません(。。;) x64では、 __stdcall=__cdecl=(__fastcall) となるならば、x64では動き、win32では、動かないと思うのですが…。 なんだかリンク等とは逆の減現象になっているようなのですが…。 visual studio の設定で逆にする設定があるのでしょうか? 質問ばかりで申し訳ないです。
- osenbeyaketa
- ベストアンサー率75% (15/20)
ソース見ないとなんとも言えませんが、extern "C" の問題の気がします。 名前が(?aaaa@@$$J212YGHHPAE0@Z)になっているのが、変かなあ・・・。 C 呼び出しなら、こういう名前にはならないと思うのですが。
お礼
ご回答ありがとうございます。 一応動くようにはなりました(^^;) __stdcall を取ってやると動くようになりました。 x64 でビルドするときは、あっても通るのに win32 でビルドすると取らないと通らないんですよねぇ(..;) 何故かでしょうか?? 気持ちが悪いのではっきりさせたいんですが…。
お礼
いろいろありがとうございました。 何とか解決することができました。(^^;) 結局DLLのコンパイル時の呼び出し規約の設定を、 __stdcall にすることで解決できました! 色々ヒントをいただいて感謝しています。 ありがとうございました。