Vista 32bitでVisualStudio2008proを使って開発中に外部シンボルの未解決エラーが発生

このQ&Aのポイント
  • Vista 32bitでVisualStudio2008proを使って開発中に、外部シンボルの未解決エラーが発生しています。
  • ヘッダーファイルとlibファイルをインクルードしてリンクしているにも関わらず、エラーLNK2001が解決されません。
  • 64bit環境では問題なくコンパイルが通っているため、設定の問題ではないかと思っています。困っているので助けてください。
回答を見る
  • ベストアンサー

質問させてください。

質問させてください。 vista 32bit で VisualStudio2008pro を使い開発をしています。 ヘッダーファイルもインクルードし、 libファイルもリンクしているのですが、 下のエラーがなくなりません。 error LNK2001: 外部シンボル ""extern "C" int __stdcall aaaa(int,unsigned char *,unsigned char *)" (?aaaa@@$$J212YGHHPAE0@Z)" は未解決です。 DLLをインポートするヘッダーでは、 __declspec(dllimport)を使いインポートしています。 インポートのヘッダーは、64bit でも使っていて、 そちらはちゃんとコンパイルは通ります。 色々調べまわって、設定も色々変えてみたのですが 全然変わらないです。 本当に困っています。 わかる方がいられれば是非ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

あれ、一昨日補足したのが消えてるみたいです。 では、もう一度。 これはフォームのプログラムだったのですね。 そちらはあまり詳しくないのですが、/clrあたりが絡んでいるのかなあ。 設定を作り直したということは、もう以前の問題を再確認するのは無理でしょうね。 問題点が呼び出し規約にありそうというのは、たぶん間違いところですので、フォーム側とDLL側の設定や宣言を確認してみるのが先決かと。 その上で、Win64とWin32の違いを比較されるのが良いでしょう。

newcomerPG
質問者

お礼

いろいろありがとうございました。 何とか解決することができました。(^^;) 結局DLLのコンパイル時の呼び出し規約の設定を、 __stdcall にすることで解決できました! 色々ヒントをいただいて感謝しています。 ありがとうございました。

その他の回答 (3)

回答No.3

__stdcall無しで上手く行くということは、呼び出される側が__cdeclだと思われます。 宣言が、上手く一致してないのでは。 Win32では、__cdeclに合わせることで動くようになったのでしょう。 Win64ですが、これまでの話しだとWin64では上手く行っていたように思っていたのですが、動かないのでしょうか?

newcomerPG
質問者

お礼

確かに、DLLのソースを見ると、__stdcallは付いていませんでした。 しかし win64では、__stdcallがあれば動きます。 無いと“呼び出し規約が、メタデータに見つかりませんでした” と言われます。 win32では、__stdcallがあってもなくても、“外部シンボルが未解決”だと言われます。 (因みに設定を色々弄っていたので、最初から作り直しましたところ、呼び出し規約あっても無くても動きません。) libファイルは32と64で入れ替えているのですが…。 見比べていたら、 プリコンパイラの定義が違うと言う事は分かったのですが、これも原因になるのでしょうか?

newcomerPG
質問者

補足

すいません、プリコンパイラの定義は同じでした、 そして、win64のコードを、win32でコンパイルしたところ、 error C2871: 'System' : この名前を指定された名前空間は存在しません。 c:\users\ks\desktop\csample\csample\Form1.h と言われてしまいました… もう意味が分かりません。

回答No.2

__stdcallの方でしたか。(^^;) Win64の件を調べてみましたが、Win64ではレジスタ数が増えたので__stdcallのような呼び出し規約は無視されるみたいです。 つまり何を指定しても同じに扱うから、64bitではエラーが出なかったと。 こちらなど参考にどうぞ。 http://homepage1.nifty.com/herumi/prog/x64.html http://d.hatena.ne.jp/shiku_otomiya/20090518/p1

newcomerPG
質問者

お礼

参考URLありがとうございます。(^^) 参考になりました。 しかし、 64bitでは、何で呼び出しても同じだと言うのならば、 x64では、__stdcallなしでも動きそうですが、 動かずにエラーになり、 なぜwin32では、呼び出し規約なしで動くのかが分かりません(。。;) x64では、 __stdcall=__cdecl=(__fastcall) となるならば、x64では動き、win32では、動かないと思うのですが…。 なんだかリンク等とは逆の減現象になっているようなのですが…。 visual studio の設定で逆にする設定があるのでしょうか? 質問ばかりで申し訳ないです。

回答No.1

ソース見ないとなんとも言えませんが、extern "C" の問題の気がします。 名前が(?aaaa@@$$J212YGHHPAE0@Z)になっているのが、変かなあ・・・。 C 呼び出しなら、こういう名前にはならないと思うのですが。

newcomerPG
質問者

お礼

ご回答ありがとうございます。 一応動くようにはなりました(^^;) __stdcall を取ってやると動くようになりました。 x64 でビルドするときは、あっても通るのに win32 でビルドすると取らないと通らないんですよねぇ(..;) 何故かでしょうか?? 気持ちが悪いのではっきりさせたいんですが…。

関連するQ&A

  • ビルドエラー

    現在wrapi(http://sysnet.ucsd.edu/pawn/wrapi/download.html)を使いサンプルプログラムWrapiTest.cpp をVC++6.0で実行を試みています。しかしコンパイルは通るのですビルドがうまくいきません。 ビルドしようとすると以下のエラーが出力しました。 リンク中... WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPIGetPacketStats(struct DOT_11_STATS *)" (__imp_?WRAPIGetPacketStats@@YAJPAUDOT_11_STATS@@@Z)" は未解決です WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPIGetAssociatedAP(unsigned char * const)" (__imp_?WRAPIGetAssociatedAP@@YAJQAE@Z)" は未解決です WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPIGetRTSThreshold(unsigned long *)" (__imp_?WRAPIGetRTSThreshold@@YAJPAK@Z)" は未解決です WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPISetSSId(unsigned char *,unsigned long &)" (__imp_?WRAPISetSSId@@YAJPAEAAK@Z)" は未解決です WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPIGetSSId(unsigned char *)" (__imp_?WRAPIGetSSId@@YAJPAE@Z)" は未解決です WrapiTest.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) long __cdecl WRAPIOpenNdisDevice(unsigned short *)" (__imp_?WRAPIOpenNdisDevice@@YAJPAG@Z)" は未解決です (省略) Debug/WrapiTest.exe : fatal error LNK1120: 外部参照 7 が未解決です。 何が原因なのか教えていただけないでしょうか。 よろしくお願いします。

  • VC2005のDLLを6.0で呼び出すには

    VC 2005 Pro Editionで作ったライブラリ(ヘッダ、lib、dll)を頂きました。    頂いたDLLの形式は定義ファイル.defを使わない形式、declspec(dllexport)を使う形式の方です。  呼び出し側はVC6.0EnterPrize(SDK)を使います。 (諸事情により6.0以上にUPすることは不可能)     まず、静的リンクをし、関数を呼び出してみました。  (設定のリンクよりlibをリンクさせ、ヘッダをインクルードして)  すると以下のメッセージが出てしまいます。 リンク中... Dialog1.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) void __cdecl Init(unsigned char *,unsigned char *,unsigned char *,unsigned char *)" (__imp_?Init_Card@@YAXPAE000@Z)" は未解決です Debug/CardMake.exe : fatal error LNK1120: 外部参照 1 が未解決です 。 link.exe の実行エラー    色々やってみましたが、このエラーから回避できませんでした。  ヘッダ自体に #ifdef _USRDLL #define DLL_PORT __declspec(dllexport) #else #define DLL_PORT __declspec(dllimport) #endif    の宣言があるので、別に特別なことをしなくても、大丈夫そうなのですが、何故か出来ません。  次に動的リンクを行っていました。  するとLoadLibraryでエラーになり、GetLastErrrorで14001(エラーメッセージはつかめず)が返ってきました。 (色々調べたところ定義ファイルがないと動的リンクはできないようですね)    というわけでにっちもさっちも行かなくなった状況です。  そこでご質問です。 (1)定義ファイルを使わない形式のライブラリ(暗示的に定義されているもの)はどのように呼び出させばよいでしょうか? (2)2005のライブラリを6.0から呼び出すことは可能ですか?  また呼び出す方法は?  すいませんがご回答をお願いします。

  • グローバル変数

    分割コンパイルで、持ちいる変数をヘッダーファイルに宣言しました。 ヘッダーファイル内で次のように宣言し、メインの関数でない場合にはexternになるようにしました。 メインなら FILEは1 それ以外なら0 #if FILE   unsinged int inputNo; #else  extern unsigned int inputNo; #endif しかし、リンクをさせると error LNK2001: 外部シンボル "_inputNo" は未解決です と出てしまいます。解決策はあるでしょうか? プロジェクトの設定の関係でしょうか?よろしくお願い致します。

  • プロジェクトを作った際のエラー

    VisualC++ 2005 Express Editionを使用してます win32コンソールアプリケーション - アプリケーション設定 - windowsアプリケーション この新しく作ったプロジェクトを何もいじらずにビルドすると __imp__EndPaint@8 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__BeginPaint@8 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DefWindowProcW@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DestroyWindow@4 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DialogBoxParamW@20 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__EndDialog@8 が関数 "int __stdcall About(struct HWND__ *,unsigned int,unsigned int,long)" (?About@@YGHPAUHWND__@@IIJ@Z) で参照されました。 C:\C++test\test\Debug\test.exe : fatal error LNK1120: 外部参照 19 が未解決です。 というエラーが出てしまいます 800文字オーバーしてしまうのでエラーの前半部分を消してあります この原因と解決方法を教えてください よろしくお願いします

  • PythonでDLLからの戻り値で文字列の場合を正しく表示させたい

    VisualStudio2005でDLLを作成して、Python2.6のctypesモジュールを使って、PythonからC++のルーチンを呼び出す際に、文字列を引数として、文字列を戻り値として使えるようにC++を記述したいのですがどうすればよいのでしょうか? 関数呼び出しは __stdcallです。 __declspec(dllexport) unsigned char* __stdcall Test(const char *s, int n); とした場合、Pythonで戻り値を見るとint型の数値でした。 from ctypes import * lib = windll.LoadLibrary("test.dll") s = lib.Test("abcdefghijk", 3) print s

  • 『外部シンボル~未解決です。』のエラーについて

    以前、Cで書かれているプログラムがあり、 今回、マネージプログラム上(.net framework)でソースを そのまま流用しようとしています。 貼り付けたのはいいのですが、コンパイルすると以下のような エラーが出力されてしまいます。 たぶん、cのライブラリ(関数)を使用しているからだと思うのですが、 対処方法が一向に分かりません。 TestDll error LNK2001: 外部シンボル ""int __cdecl sprintf(char *,char const *,...)" (?sprintf@@$$J0YAHPADPBDZZ)" は未解決です。 TestDll error LNK2001: 外部シンボル ""char * __cdecl strcat(char *,char const *)" (?strcat@@$$J0YAPADPADPBD@Z)" は未解決です。 TestDll error LNK2001: 外部シンボル ""int __cdecl strncmp(char const *,char const *,unsigned int)" (?strncmp@@$$J0YAHPBD0I@Z)" は未解決です。 御存知の方、ご教授お願いいたします。

  • 猫でもわかるプログラミング161章

    http://www.kumei.ne.jp/c_lang/sdk2/sdk_161.htm にDLLを使ったメッセージフックについて説明があるのですが、どうもその通りにやってもうまくいきません。 まず、 1.dll作成する際にlibが生成されない。 2.ヘッダファイルに #define EXPORT extern "C" __declspec(dllexport) を付け加え、 EXPORT LRESULT CALLBACK .... という風にEXPORTをつけてビルドすると、libファイルが生成されるものの、それをメインプログラムのプロジェクトに追加しても リンク中... hookmain.obj : error LNK2001: 外部シンボル ""int __cdecl ResetHook(void)" (?ResetHook@@YAHXZ)" は未解決です hookmain.obj : error LNK2001: 外部シンボル ""int __cdecl SetHook(void)" (?SetHook@@YAHXZ)" は未解決です Debug/hook.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー というエラーが起きます。 このエラーが何を意味しているかもわからず、dllについても勉強中なのでどこを直せばいいかがみえてきません。どなたかわかる方がいらしたらよろしくお願いします VC++ 6.0 WinXP

  • 猫でもわかるWindowsプログラムについて・・

    いま猫でもわかるWindowsプログラムという本でCの勉強をしているのですが。 一番最初の問題で詰まりました教えてください。 リンク中... 何もないプログラム.obj : error LNK2001: 外部シンボル ""int __cdecl InitINstance(struct HINSTANCE__ *,int)" (?InitINstance@@YAHPAUHINSTANCE__@@H@Z)" は未解決です 何もないプログラム.obj : error LNK2001: 外部シンボル ""long __stdcall wndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?wndProc@@YGJPAUHWND__@@IIJ@Z)" は未解決です LIBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です Debug/何もないプログラム.exe : fatal error LNK1120: 外部参照 3 が未解決です。 link.exe の実行エラー 何もないプログラム.exe - エラー 4、警告 0 エラーの意味がわかりません。教えてください、何もないプログラムというのはプログラムの名前です、

  • Visual C++ 2005 Express EditionでLINK2019エラー

    Visual C++ 2003.netからVisual C++ 2005 Express Editionに移行した際に、以前書いたプログラムがリンクエラーで動かなくなってしまいました。 追加するLibディレクトリが足りないのかと思ったのですが、何が足りないのか見つけることができませんでした。 解決法を教えていただけないでしょうか。 OSはWindows XPです。 よろしくお願いします。 エラーメッセージの内容↓ ------------------------------- error LNK2019: 未解決の外部シンボル __imp__GetWindowPlacement@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__DispatchMessageA@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__TranslateMessage@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__PeekMessageA@20 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__ValidateRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__ShowWindow@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__SetWindowPos@28 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetWindowRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetClientRect@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__CreateWindowExA@48 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__GetSystemMetrics@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__RegisterClassExA@4 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__LoadCursorA@8 が関数 _WinMain@16 で参照されました。 error LNK2019: 未解決の外部シンボル __imp__DefWindowProcA@16 が関数 "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 error LNK2019: 未解決の外部シンボル __imp__PostQuitMessage@4 が関数 "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 現在追加されているLibディレクトリ↓ ------------------------------------------- $(VCInstallDir)lib $(VCInstallDir)PlatformSDK\lib $(FrameworkSDKDir)lib $(VSInstallDir) $(VSInstallDir)lib C:\Program Files\Microsoft Platform SDK\Lib C:\Program Files\Microsoft DirectX SDK (April 2007)\Lib\x86

  • C#からVC++DLLの呼び出しに失敗する

    VS.NET2005のC#からVC++6.0で作成したDLLを呼び出しています。 VCのデバッガでデバッグしてみると呼び出した関数は正常に動作しているようなのですが、最後のreturnを実行しC#に戻るところでエラーが出てしまいます。 C#側では「'System.ExecutionEngineException' のハンドルされていない例外が ConsoleApplication1.exe で発生しました。」となります。 C#での宣言は、 [DllImport("test.dll")] public static extern uint TestFunc(ref byte[] moji, ref uint nagasa); です。 VC++の宣言は、 __declspec(dllexport) unsigned long __stdcall TestFunc(unsigned char* moji, unsigned long* nagasa) です。 C#へ値を返さない関数は問題ないのですが、値を返そうとすると起きるようです。不備などあればご指摘いただけないでしょうか。 ちなみにVB6からは問題なく動作できました。

専門家に質問してみよう