外部シンボルが未解決とは何ですか?リンクエラーなのでしょうか?

このQ&Aのポイント
  • 「外部シンボルが未解決」とは、プログラム中で使用されている関数や変数が見つからないことを意味します。Windowsのプログラムで「外部シンボル 'MyCreateFontが未解決'」というメッセージが出た場合は、リンクエラーが発生している可能性があります。
  • 外部シンボルが未解決と表示された場合、以下の処置を行うことが推奨されます: 1. 関連するヘッダーファイルやライブラリが正しくインクルードされているか確認する 2. リンカーオプションが正しく設定されているか確認する 3. 必要なライブラリがプロジェクトに追加されているか確認する 4. シンボルの定義が正しく行われているか確認する 5. コンパイラが正しい言語モードで動作しているか確認する
  • これらの処置を行っても問題が解決しない場合は、他の原因(例:環境設定の問題)が考えられますので、詳細なエラーメッセージを確認するか、デバッグツールを使用して解析することをおすすめします。
回答を見る
  • ベストアンサー

「外部シンボルが未解決」について教えてください

BCCを使ってます。windowsのプログラムで、『外部シンボル 'MyCreateFontが未解決』と言うメッセージが出たのですが、リンクエラーなのでしょうか? また、『外部シンボル○○が未解決』と表示された場合、どのような処置をすればいいですか。アドバイスをお願いします。 D:\borland\bcc55\lesson>bcc32 -W -w-8057 timer.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland timer.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'MyCreateFont(int, unsigned long, const char *)' が未解決(D:\BORLAND\BCC55\LESSON\TIMER.OBJ が参照 ) こちらが、宣言の部分です。 #include <windows.h> #define ID_MYTIMER 100 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ATOM InitApp(HINSTANCE); BOOL InitInstance(HINSTANCE, int); HFONT MyCreateFont(int, DWORD, LPCTSTR); char szClassName[] = "clock"; //ウィンドウクラス int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow)

noname#220054
noname#220054

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アドバイス ・MyCreateFont() 関数の実体のソースはどこにありますか?確認を。  ちなみに『外部シンボルが未解決』というのはリンクエラーですね。  エラーメッセージから TIMER.OBJ 内で MyCreateFont() 関数を呼び出しているようです。  よって、MyCreateFont() 関数の実体をどこにあるのか確認して下さい。  別のソースに記述されている場合は、そのソースファイルもコンパイルしてリンクさせます。 >HFONT MyCreateFont(int, DWORD, LPCTSTR);  ↑この関数をコンパイルするソースに記述するなどすれば良いと思います。 ・以上。いろいろと確認をして下さい。→できたら全ソースを貼り付けてみて下さい。

noname#220054
質問者

補足

いつもアドバイスを頂き有難うございます。 ご指摘のように、MyCreateFont()関数の実体を確認したところ、記述していませんでした。 プログラムの一番最後に追加で記述すると無事に実行することが出来ました。(デジタル時計を作るプログラムです) 確認の意味での質問なのですが、 1、HFONT MyCreateFont(int, DWORD, LPCTSTR); は、プロトタイプ宣言 2、HFONT MyCreateFont(int nHeight, DWORDdwCharSet,LPCTSTRlpName)   こちらは、MyCreateFont()関数の定義なので、『メイン関数の外で定義をする』と、理解していいのでしょうか? 3、またCreate○○と言う自作関数を呼び出す時のウィンドウメッセージは、WM_CREATEでも WM_PAINT でもいいのでしょうか? すべてのソースを貼り付けると文字数オーバーとなってしまうので、ウィンドウプロシージャの部分のみ張りつけます。よろしくお願いします。 //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int id; HDC hdc; PAINTSTRUCT ps; static char szTime[64], szDate[64]; SYSTEMTIME st; HFONT hFont1, hFont2; switch (msg){ case WM_CREATE: SetTimer(hWnd, ID_MYTIMER, 500, NULL); //タイマの作成 break; case WM_TIMER: //関係ないタイマイベントは、DefWindowProcに任せる if (wp != ID_MYTIMER) return (DefWindowProc(hWnd, msg, wp, lp)); GetLocalTime(&st); wsprintf(szTime, "%02d:%02d:%02d", st.wHour, st.wMinute, st.wSecond); wsprintf(szDate, "%d年 %02d月 %02d日", st.wYear, st.wMonth, st.wDay); //クライアント領域全体を更新 InvalidateRect(hWnd, NULL, TRUE); SetWindowText(hWnd, szTime); break; case WM_LBUTTONDBLCLK: SendMessage(hWnd, WM_CLOSE, 0, 0); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hFont1 = MyCreateFont(12, SHIFTJIS_CHARSET, "MS ゴシック"); SelectObject(hdc, hFont1); TextOut(hdc, 5, 5, szDate, (int)strlen(szDate)); hFont2 = MyCreateFont(30, ANSI_CHARSET, "MS ゴシック"); SelectObject(hdc, hFont2); SetTextColor(hdc, RGB(0, 0, 255)); TextOut(hdc, 10, 20, szTime, (int)strlen(szTime)); DeleteObject(hFont1); DeleteObject(hFont2); EndPaint(hWnd, &ps); break; case WM_CLOSE: id = MessageBox(hWnd, "終了してもよろしいですか", "確認", MB_YESNO | MB_ICONQUESTION); if (id == IDYES){ if (KillTimer(hWnd, ID_MYTIMER) == 0){ MessageBox(hWnd, "KILLTimer Error!", "Error", MB_OK | MB_ICONEXCLAMATION); } DestroyWindow(hWnd); } break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //この関数を追加したら実行できました。 HFONT MyCreateFont(int nHeight, DWORD dwCharSet, LPCTSTR lpName) return(CreateFont(nHeight, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, dwCharSet, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, lpName)); }

その他の回答 (1)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★回答 ・(1)…『プロトタイプ宣言』で正しいです。 ・(2)…サブ関数ですので main() には記述できません。よって、正しい解釈です。 ・(3)…基本的にはどこでも良い。でも、WM_PAINT で毎回、同じフォントを作成→削除を  繰り返すのならば、最初の WM_CREATE で HFONT ハンドルを作成して保存。その後に  WM_PAINT で使う。WM_CLSOE で保存しておいた HFONT ハンドルを DeleteObject() する方が  良いと思います。ただ、フォント、ビットマップなど大量にリソースを消費するのもは作成  したら即、削除するほうが良いね。フォントの量にもよりますし、まぁ自由ですか。今回は。 ・以上。

noname#220054
質問者

お礼

アドバイス有難うございます。また的確なご指摘により、記述ミスを発見することが出来ました。一歩前進することが出来ました。 有難うございます。

関連するQ&A

  • 未解決の外部シンボル

    C言語は少しやっていたことがあり このたび、Winapiをしてみようと はじめました。 参考に見つけてきたプログラム #include <windows.h> #include <tchar.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd) { MessageBox( NULL, _T("Hello World"), _T("メッセージ"), MB_OK ); return 0; } をコンパイルしようとしたところ error LNK2019:未解決のシンボル __imp__MessageBoxA@16が関数_WinMain@16で 参照されました。 fatal errorLNK1120:外部1が未解決です。 と出てきます。 どうすればいいのでしょうか・・・ 困っています誰か助けてください Windows XP SP3 Visual Studio C++ 2008 Express Edition

  • 外部シンボル "_main"は未解決です

    「LIBC.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です」というエラーが発生しましたが、何をみればいいのかわかりません。int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )がソースについています。

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

    以前、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)" は未解決です。 御存知の方、ご教授お願いいたします。

  • DxLibについて質問です

    DxLibを使ったプログラムがコンパイルできません。 下がそのプログラムです #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if( DxLib_Init() == -1 ) { return -1; } DrawBox(100,100,300,300,GetColor(255,255,255),TRUE); WaitKey(); DxLib_End(); return 0; } http://p.booklog.jp/book/46490/chapter/77396 このサイトに従って、DXライブラリを使うセットアップをしたのですが、 下のようなエラーコードが出てきます。 ■C:\Users\masaki\Desktop\C> bcc32 windows.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland windows.cpp: 警告 W8022 C:\borland\bcc55\Include\DxDirectX.h 6121: 'D_CTransInPlaceFilter::Transform(D_IMediaSample *)' が仮想関数 'D_CTransformFilter::Transform(D_IMediaSample *,D_IMediaSample *)' を隠蔽する 警告 W8094 C:\borland\bcc55\Include\DxLib.h 100: #pragma comment( <type> [,"string"] ) の使用法に誤りがある 警告 W8094 C:\borland\bcc55\Include\DxLib.h 101: #pragma comment( <type> [,"string"] ) の使用法に誤りがある 警告 W8094 C:\borland\bcc55\Include\DxLib.h 102: #pragma comment( <type> [,"string"] ) の使用法に誤りがある 警告 W8057 windows.cpp 13: パラメータ 'hInstance' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 windows.cpp 13: パラメータ 'hPrevInstance' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 windows.cpp 13: パラメータ 'lpCmdLine' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) 警告 W8057 windows.cpp 13: パラメータ 'nCmdShow' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Fatal: ファイル SHELL32.LIB が開けません shell32.libが開けないとあり、自分でも調べたのですが、自分にはその内容が理解できず、このサイトに質問を投稿しました。 コンパイラは、Borland C++ Compiler 5.5.1 OSは、Windows 7 Ultimate エディタは、CPad for Borland C++ Compiler ver.2.3.1 です。 よろしくお願いします。

  • 「外部シンボル '__inp' が未解決」

    Borland C++CompilerとCPad for Borland C++Compilerをつかってdllを作ろうとしているのですが、 コンパイルがうまく行きません。 ------------------------------<Dio32c.c>------------------------------ #include "jni.h" #include <stdio.h> #include <conio.h> JNIEXPORT long JNICALL Java_IO32_InpB(JNIEnv *env, jobject obj, long port) { return _inp(port); } JNIEXPORT void JNICALL Java_IO32_OutB(JNIEnv *env, jobject obj, long port, long data) {_outp(port, data); return; } ---------------------------------------------------------------------- というプログラムに対し、コンパイル時パラメータを「-WD」と指定してコンパイルすると、以下のメッセージが返ってきちゃいます。 ---------------------------------------------------------------------- ■C:\My Documents\C> bcc32 -WD Dio32jc.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland Dio32jc.c: ==<警告文は字数制限のため割愛させていただきました。by taropoo>== Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '__inp' が未解決(C:\MY DOCUMENTS\C\DIO32JC.OBJ が参照) Error: 外部シンボル '__outp' が未解決(C:\MY DOCUMENTS\C\DIO32JC.OBJ が参照) ---------------------------------------------------------------------- どなたか、原因&対策、分かりませんでしょうか?

  • libjpegに関する質問

    bcc5.5.1でlibjpegを使いたいのですがうまくいきません 説明サイトどおりにmakeして、生成された全てのヘッダファイルをc:¥borland\bcc55¥Includeに移動してlibjpeg.libはc:¥borland¥bcc55¥Libに移動したのですが、 Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland jpeg_read_test.c: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '_jpeg_std_error' が未解決(C:\CPP\JPEG_READ_TEST.OBJ が参照) Error: 外部シンボル '_jpeg_CreateDecompress' が未解決(C:\CPP\JPEG_READ_TEST.OBJ が参照) Error: 外部シンボル '_jpeg_stdio_src' が未解決(C:\CPP\JPEG_READ_TEST.OBJ が参照) Error: 外部シンボル '_jpeg_read_header' が未解決(C:\CPP\JPEG_READ_TEST.OBJ が参照) と出てしまいます。 libjpeg.libが認識されていないのだと思いますが解決方法が分かりません 知っている方がいたら教えてください

  • Windowsアプリケーションをどうしても作りたいのですが

    /* OS==XP コンパイラー==Borland C++5.5 */ #include<windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow ) { return 0; } で Error: 外部シンボル '_main' が未解決(C:\BORLAND\BCC55\LIB\C0X32.OBJ が参照) となるのでexeファイルができません。 解決法を是非教えてください。 C言語歴2日+1H

  • WinMainの第3引数のlpszCPを・・・

    WinMainの第3引数のlpszCPを使うのをやめたとたんに Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 警告 W8057 program.cpp 335: パラメータ 'lpszCP' は一度も使用されない(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland という警告が出始めたのですが普通lpszCPは使わないものなのではないでしょうか? 警告を回避するにはどうしたらいいでしょうか?

  • lstrcpyが使えない

    #include <dshow.h> としてlstrcpyを加えたコードを bcc32でコンパイルするとエラーが出ます。他にも色々使えない関数が出てきました。 --------------------------------------------- #include <windows.h> #include <dshow.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow){ TCHAR ore[64]; lstrcpy(ore,TEXT("こんにちは")); return 0; } --------------------------------------------- bcc32 -I"C:\Borland\Bcc55\Include" -L"C:\Borland\Bcc55\Lib" -I"C:\Program Files\Microsoft DirectX 9.0 SDK (October 2005)\Include" -L"C:\Program Files\Microsoft DirectX 9.0 SDK (October 2005)\Lib" -I"C:\Program Files\Microsoft Platform SDK\Include" -L"C:\Program Files\Microsoft Platform SDK\Lib" -W test.cpp --------------------------------------------- エラー E2451 test.cpp 7: 未定義のシンボル lstrcpy_instead_use_StringCbCopy_or_St ringCchCopy(関数 __stdcall WinMain(HINSTANCE__ *,HINSTANCE__ *,char *,int) ) もし解決方をご存知の方がいらっしゃいましたらご教授なにとぞお願い致します。

  • リンク時エラー

    DirectShowのSampleGrabberを使ったプログラムをborland C++ コンパイラでコンパイルしようとしたときにエラーが出てしまいます。 bcc32 -I"C:\Borland\Bcc55\Include" -L"C:\Borland\Bcc55\Lib" -I"c:\Program Files\Microsoft Platform SDK\Include" -L"c:\Program Files\Microsoft Platform SDK\Lib" -L"C:\Program Files\Microsoft DirectX 9.0 SDK (October 2005)\Lib" -------------------------------------------------- Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '_CLSID_SampleGrabber' が未解決(C:\CPP\DIRECTSHOW\CTHUMBNAI L.OBJ が参照) Error: 外部シンボル '_IID_ISampleGrabber' が未解決(C:\CPP\DIRECTSHOW\CTHUMBNAIL .OBJ が参照) Error: 外部シンボル '_MEDIATYPE_Video' が未解決(C:\CPP\DIRECTSHOW\CTHUMBNAIL.OB J が参照) Error: 外部シンボル '_MEDIASUBTYPE_RGB24' が未解決(C:\CPP\DIRECTSHOW\CTHUMBNAIL .OBJ が参照) Error: 外部シンボル '_FORMAT_VideoInfo' が未解決(C:\CPP\DIRECTSHOW\CTHUMBNAIL.O BJ が参照) DierctShowは最近Platform SDKに統合されたらしいのでPlatform SDKからインクルードしています。 ご存知の方がいらっしゃいましたらご教授お願い致します。

専門家に質問してみよう