質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

2回答

3434閲覧

TextOut、GetStockObjectが見つからないとでる

yukkuri

総合スコア624

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

1クリップ

投稿2018/10/17 14:19

編集2018/10/18 09:09

前提・実現したいこと

Win32APIでウィンドウを表示しようとしたら、エラーが発生しました。

発生している問題・エラーメッセージ

MBox.cpp: In function 'int WinMain(HINSTANCE__*, HINSTANCE__*, TCHAR*, int)': MBox.cpp:30:59: error: '_GetStockObject' was not declared in this scope MBox.cpp: In function 'LRESULT WndProc(HWND__*, UINT, WPARAM, LPARAM)': MBox.cpp:71:50: error: '_TextOut' was not declared in this scope

該当のソースコード

C

1#include <windows.h> 2#include <tchar.h> 3 4/** 5 * ウィンドウプロシージャー 6 */ 7LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); 8 9TCHAR szClassName[] = TEXT( "line" ); 10/** 11 * メイン関数 12 */ 13int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPreInst, TCHAR* lpsCmdLine, int nCmdShow ) 14{ 15/* if( MessageBox( 0, TEXT( "hello!" ), TEXT( "message" ), MB_YESNO ) == IDYES ){ 16 MessageBox( 0, TEXT( "yes" ), TEXT( "結果" ), MB_OK ); 17 }*/ 18 HWND hWnd; 19 MSG lpMsg; 20 WNDCLASS wc; 21 22 if( !hPreInst ){ 23 wc.style = CS_HREDRAW | CS_VREDRAW; 24 wc.lpfnWndProc = WndProc; 25 wc.cbClsExtra = 0; 26 wc.cbWndExtra = 0; 27 wc.hInstance = hInstance; 28 wc.hIcon = NULL; 29 wc.hCursor = LoadCursor( NULL, IDC_ARROW ); 30 wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); 31 wc.lpszMenuName = NULL; 32 wc.lpszClassName = szClassName; 33 if( !RegisterClass( &wc ) ){ 34 return -1; 35 } 36 } 37 38 hWnd = CreateWindow( szClassName, 39 _TEXT( "タイトル" ), 40 WS_OVERLAPPEDWINDOW, 41 CW_USEDEFAULT, 42 CW_USEDEFAULT, 43 CW_USEDEFAULT, 44 CW_USEDEFAULT, 45 NULL, NULL, 46 hInstance, NULL 47 ); 48 ShowWindow( hWnd, nCmdShow ); 49 UpdateWindow( hWnd ); 50 while( GetMessage( &lpMsg, NULL, 0, 0 ) ){ 51 TranslateMessage( &lpMsg ); 52 DispatchMessage( &lpMsg ); 53 } 54 return (int)lpMsg.wParam; 55} 56 57LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) 58{ 59 HDC hdc; 60 PAINTSTRUCT ps; 61 const TCHAR* buf = TEXT( "Sample" ); 62 63 switch( msg ){ 64 case WM_DESTROY:{ 65 PostQuitMessage( 0 ); 66 break; 67 } 68 case WM_PAINT:{ 69 hdc = BeginPaint( hWnd, &ps ); 70 71 TextOut( hdc, 0, 0, buf, (int)_tcslen( buf ) ); 72 73 EndPaint( hWnd, &ps ); 74 break; 75 } 76 default:{ 77 return( DefWindowProc( hWnd, msg, wParam, lParam ) ); 78 } 79 } 80 return ( 0L ); 81} 82

試したこと

ネットを調べましたが、よくわかりませんでした。

補足情報(FW/ツールのバージョンなど)

Windows10、MinGWです。どちらも64bitです。
MinGW:gcc (GCC) 4.5.4 20111030 (prerelease) [svn/rev.180676 - mingw-w64/oz]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こちらも試してみましたが、yukkuri さんとは発生している現象が違うようです。私の方で出たエラーは下図のようにインポートライブラリが足りないエラーですね。
ーlgdi32
こちらのエラーは -lgdi32 で明示的にインポートライブラリを指定してやれば解消します。user32 はデフォルトでインポートライブラリに含まれているのに、gdi32 が含まれていないのは意外でもありますが・・・。

そちらで発生しているエラーはヘッダファイルに関数の定義がないというエラーで、こちらとは発生している現象が異なります。 mingw64 のバージョンを上げてみるなりすれば解消するかもしれません。こちらは久々の mingw でしたので最新バージョン 8.1 まで上げてから試しています。
gcc --version

インクルードファイルを調べるためには -v オプションを付けてコンパイラを起動すると良いです。

gcc -v teratail152662.c

出力は長いので省きますが、以下のようにインクルードディレクトリが表示されますので、正しいヘッダファイルがインクルードされているかどうかを確認することをお勧めします。
includes

2018/10/19 追記
原因はコンパイル環境が正しくないことで間違いないと思うのですが、yukkuri さんと同じ環境を構築することができないため的確な回答を提示することができません。MinGW 4.5.4 が入手できなかったため、再現環境を構築することができませんでした。なお、もともと提示されているエラーのうち TextOut に関するものはリンク時には TextOutA か TextOutW のどちらかに解決する必要があるため、適切なインクルードファイルなしには解決できない問題となります。そのため、オプションでコンパイルが通ったというのは、信じがたい状況となります。

テスト的に #include の下部分の内容を追記してコンパイルと実行ができるか試していただけないでしょうか?

C

1#include <windows.h> 2#include <tchar.h> 3 4WINGDIAPI HGDIOBJ WINAPI GetStockObject(int i); 5#undef TextOut 6#if defined(UNICODE) 7# define TextOut TextOutW 8#else 9# define TextOut TextOutA 10#endif 11WINGDIAPI WINBOOL WINAPI TextOutA(HDC hdc,int x,int y,LPCSTR lpString,int c); 12WINGDIAPI WINBOOL WINAPI TextOutW(HDC hdc,int x,int y,LPCWSTR lpString,int c); 13 14/** 15 * ウィンドウプロシージャー 16 */ 17LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );

2018/10/21 追記
Mingw64 4.5.4 を入手してやってみましたが、残念ながら yukkuri さんのところで発生している状況を再現することはできませんでした。とは言っても微妙にバージョンは違います。以下のように普通にコンパイルできました。
4.5.4でコンパイル
駄目でもともとですが、上記のように -lgdi32 の後に -Wl,-subsystem,windows を追記して試してみてください。

リンクまでできているならインクルードファイルの問題はなさそうな気がしますが。環境変数 C_INCLUDE_PATH が設定されているかだけ確認してもらった方が良いかもしれません。この環境変数が設定されているのであれば、環境変数を削除した後、コンパイルしてみてください。

なお、

エラーが出る例:gcc -lgdi32 ファイル名

エラーが出ない例:gcc ファイル名 -lgdi32

これは gcc としては標準の動作です。ほとんどの C コンパイラはリンカに渡すオプションはソースファイルの指定より後に記述する必要があります。

投稿2018/10/17 15:43

編集2018/10/20 16:02
atata0319

総合スコア881

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkuri

2018/10/18 09:11

オプションをつけたらコンパイルが通りました。しかし、起動しても何も起こりません。そこについて教えてもらえませんか?
atata0319

2018/10/18 18:03

回答に追記しました。ご確認ください。
yukkuri

2018/10/19 08:07

今コンパイルしたら、通りません。エラーは、上の関数が見つからないエラーでした。 オプション-lgdi32を追加したら通りました。が、起動しても何も起こらないのは同様です。 もしかしたら、windowsのバージョンが古いのが(windows10の中でも)原因なのでしょうか。
atata0319

2018/10/19 15:24

MinGW64 を手動でコンパイルする場合、-lgdi32 は必須のようです。上の回答内容を追記してみましたか?
yukkuri

2018/10/20 09:05

とんでもないことが起こりました。実は、オプションをファイル名の前に置くとエラーが起き、 ファイル名の後に置くとエラーが起きずコンパイルが成功します。 エラーが出る例:gcc -lgdi32 ファイル名 エラーが出ない例:gcc ファイル名 -lgdi32
yukkuri

2018/10/20 09:06

-vを前につけても後につけても一緒でした。
atata0319

2018/10/20 16:03

回答に追記しました。私は、これ以上持ちネタがないのでアドバイスは難しいですね。
yukkuri

2018/10/21 06:37

追記していただいた情報(一番下)で解決できました。ありがとうございました。
guest

0

私の方でもコンパイルしてみましたが、atata0319さんと同じ状態になりました。
ヘッダーファイルが正しくインストールされていれば問題ないとは思うのですが、ヘッダーファイルが見つからないというエラーが出ているわけでもないのでファイル自体はあるような気がします。
また拡張子がcppですが、C++言語ではないので、拡張子はcで大丈夫です。
むしろcにしておかないと、リンクのときに新たなエラーが出てしまいます。

MinGWのバージョン
コンパイル時のgccのオプション

この2つを提示していただけるとよりよい回答が得られるかもしれません。

投稿2018/10/17 23:46

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkuri

2018/10/18 12:08

追加しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問