回答編集履歴

4 追記しました。

atata0319

atata0319 score 822

2018/10/21 01:02  投稿

こちらも試してみましたが、yukkuri さんとは発生している現象が違うようです。私の方で出たエラーは下図のようにインポートライブラリが足りないエラーですね。
![ーlgdi32](273f79659b1ad94428808f9e6a85883c.png)
こちらのエラーは -lgdi32 で明示的にインポートライブラリを指定してやれば解消します。user32 はデフォルトでインポートライブラリに含まれているのに、gdi32 が含まれていないのは意外でもありますが・・・。
そちらで発生しているエラーはヘッダファイルに関数の定義がないというエラーで、こちらとは発生している現象が異なります。 mingw64 のバージョンを上げてみるなりすれば解消するかもしれません。こちらは久々の mingw でしたので最新バージョン 8.1 まで上げてから試しています。
![gcc --version](1f7160591cc1bda0858cb6d632362174.png)
---
インクルードファイルを調べるためには -v オプションを付けてコンパイラを起動すると良いです。
```
gcc -v teratail152662.c
```
出力は長いので省きますが、以下のようにインクルードディレクトリが表示されますので、正しいヘッダファイルがインクルードされているかどうかを確認することをお勧めします。
![includes](51519b30303ae6fb6b17aea2fca2c277.png)
---
**2018/10/19 追記**
原因はコンパイル環境が正しくないことで間違いないと思うのですが、yukkuri さんと同じ環境を構築することができないため的確な回答を提示することができません。MinGW 4.5.4 が入手できなかったため、再現環境を構築することができませんでした。なお、もともと提示されているエラーのうち TextOut に関するものはリンク時には TextOutA か TextOutW のどちらかに解決する必要があるため、適切なインクルードファイルなしには解決できない問題となります。そのため、オプションでコンパイルが通ったというのは、信じがたい状況となります。
テスト的に #include の下部分の内容を追記してコンパイルと実行ができるか試していただけないでしょうか?
```C
#include <windows.h>
#include <tchar.h>
WINGDIAPI HGDIOBJ WINAPI GetStockObject(int i);
#undef TextOut
#if defined(UNICODE)
#   define TextOut TextOutW
#else
#   define TextOut TextOutA
#endif
WINGDIAPI WINBOOL WINAPI TextOutA(HDC hdc,int x,int y,LPCSTR lpString,int c);
WINGDIAPI WINBOOL WINAPI TextOutW(HDC hdc,int x,int y,LPCWSTR lpString,int c);
/**
* ウィンドウプロシージャー
*/
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
```
```
---
**2018/10/21 追記**
Mingw64 4.5.4 を入手してやってみましたが、残念ながら yukkuri さんのところで発生している状況を再現することはできませんでした。とは言っても微妙にバージョンは違います。以下のように普通にコンパイルできました。
![4.5.4でコンパイル](68addf3cced87ee7a91dcab901166b2e.png)
駄目でもともとですが、上記のように -lgdi32 の後に -Wl,-subsystem,windows を追記して試してみてください。
リンクまでできているならインクルードファイルの問題はなさそうな気がしますが。環境変数 C_INCLUDE_PATH が設定されているかだけ確認してもらった方が良いかもしれません。この環境変数が設定されているのであれば、環境変数を削除した後、コンパイルしてみてください。
なお、
> エラーが出る例:gcc -lgdi32 ファイル名
エラーが出ない例:gcc ファイル名 -lgdi32
これは gcc としては標準の動作です。ほとんどの C コンパイラはリンカに渡すオプションはソースファイルの指定より後に記述する必要があります。
3 返答を追記

atata0319

atata0319 score 822

2018/10/19 03:02  投稿

こちらも試してみましたが、yukkuri さんとは発生している現象が違うようです。私の方で出たエラーは下図のようにインポートライブラリが足りないエラーですね。
![ーlgdi32](273f79659b1ad94428808f9e6a85883c.png)
こちらのエラーは -lgdi32 で明示的にインポートライブラリを指定してやれば解消します。user32 はデフォルトでインポートライブラリに含まれているのに、gdi32 が含まれていないのは意外でもありますが・・・。
そちらで発生しているエラーはヘッダファイルに関数の定義がないというエラーで、こちらとは発生している現象が異なります。 mingw64 のバージョンを上げてみるなりすれば解消するかもしれません。こちらは久々の mingw でしたので最新バージョン 8.1 まで上げてから試しています。
![gcc --version](1f7160591cc1bda0858cb6d632362174.png)
---
インクルードファイルを調べるためには -v オプションを付けてコンパイラを起動すると良いです。
```
gcc -v teratail152662.c
```
出力は長いので省きますが、以下のようにインクルードディレクトリが表示されますので、正しいヘッダファイルがインクルードされているかどうかを確認することをお勧めします。
![includes](51519b30303ae6fb6b17aea2fca2c277.png)
![includes](51519b30303ae6fb6b17aea2fca2c277.png)
---
**2018/10/19 追記**
原因はコンパイル環境が正しくないことで間違いないと思うのですが、yukkuri さんと同じ環境を構築することができないため的確な回答を提示することができません。MinGW 4.5.4 が入手できなかったため、再現環境を構築することができませんでした。なお、もともと提示されているエラーのうち TextOut に関するものはリンク時には TextOutA か TextOutW のどちらかに解決する必要があるため、適切なインクルードファイルなしには解決できない問題となります。そのため、オプションでコンパイルが通ったというのは、信じがたい状況となります。
テスト的に #include の下部分の内容を追記してコンパイルと実行ができるか試していただけないでしょうか?
```C
#include <windows.h>
#include <tchar.h>
WINGDIAPI HGDIOBJ WINAPI GetStockObject(int i);
#undef TextOut
#if defined(UNICODE)
#   define TextOut TextOutW
#else
#   define TextOut TextOutA
#endif
WINGDIAPI WINBOOL WINAPI TextOutA(HDC hdc,int x,int y,LPCSTR lpString,int c);
WINGDIAPI WINBOOL WINAPI TextOutW(HDC hdc,int x,int y,LPCWSTR lpString,int c);
/**
* ウィンドウプロシージャー
*/
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
```
2 インクルードファイルの確認方法を追記

atata0319

atata0319 score 822

2018/10/18 00:57  投稿

こちらも試してみましたが、yukkuri さんとは発生している現象が違うようです。私の方で出たエラーは下図のようにインポートライブラリが足りないエラーですね。
![ーlgdi32](273f79659b1ad94428808f9e6a85883c.png)
こちらのエラーは -lgdi32 で明示的にインポートライブラリを指定してやれば解消します。user32 はデフォルトでインポートライブラリに含まれているのに、gdi32 が含まれていないのは意外でもありますが・・・。
そちらで発生しているエラーはヘッダファイルに関数の定義がないというエラーで、こちらとは発生している現象が異なります。 mingw64 のバージョンを上げてみるなりすれば解消するかもしれません。こちらは久々の mingw でしたので最新バージョン 8.1 まで上げてから試しています。
![gcc --version](1f7160591cc1bda0858cb6d632362174.png)
![gcc --version](1f7160591cc1bda0858cb6d632362174.png)
---
インクルードファイルを調べるためには -v オプションを付けてコンパイラを起動すると良いです。
```
gcc -v teratail152662.c
```
出力は長いので省きますが、以下のようにインクルードディレクトリが表示されますので、正しいヘッダファイルがインクルードされているかどうかを確認することをお勧めします。
![includes](51519b30303ae6fb6b17aea2fca2c277.png)
1 gccのバージョンを追記

atata0319

atata0319 score 822

2018/10/18 00:45  投稿

こちらも試してみましたが、yukkuri さんとは発生している現象が違うようです。私の方で出たエラーは下図のようにインポートライブラリが足りないエラーですね。
![ーlgdi32](273f79659b1ad94428808f9e6a85883c.png)
こちらのエラーは -lgdi32 で明示的にインポートライブラリを指定してやれば解消します。user32 はデフォルトでインポートライブラリに含まれているのに、gdi32 が含まれていないのは意外でもありますが・・・。
そちらで発生しているエラーはヘッダファイルに関数の定義がないというエラーで、こちらとは発生している現象が異なります。 mingw64 のバージョンを上げてみるなりすれば解消するかもしれません。こちらは久々の mingw でしたので最新バージョン 8.1 まで上げてから試しています。
そちらで発生しているエラーはヘッダファイルに関数の定義がないというエラーで、こちらとは発生している現象が異なります。 mingw64 のバージョンを上げてみるなりすれば解消するかもしれません。こちらは久々の mingw でしたので最新バージョン 8.1 まで上げてから試しています。
![gcc --version](1f7160591cc1bda0858cb6d632362174.png)

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る