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

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

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

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

Win32 API

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1927閲覧

GDI関数を利用するとコンパイルエラーが起きてしまう

fk_beginner

総合スコア16

C

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

Win32 API

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/02/27 07:43

課題

ウィンドウを表示するだけのプログラム(下のコードからWM_PAINTの処理を削除したもの)はコンパイル/実行することができました。

しかし下に添付したようなrectangleなどのGDI関数を利用した場合に下のようなエラーが発生してコンパイルできませんでした。

何が原因でgdi関数が読み込めていないのでしょうか?
またgdi関数で図形を表示させるためにはどうすればよいのでしょうか?

ソースコードとエラーメッセージ

sample.cpp

1#include <windows.h> 2 3LRESULT CALLBACK WndProc( 4 HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 5 6int WINAPI WinMain( 7 HINSTANCE hInstance, HINSTANCE hPrevInstance, 8 LPSTR lpszCmdLine, int nCmdShow) 9{ 10 TCHAR szAppName[] = TEXT("TestApp"); 11 WNDCLASS wc; 12 HWND hwnd; 13 MSG msg; 14 15 wc.style = CS_HREDRAW | CS_VREDRAW; 16 wc.lpfnWndProc = WndProc; 17 wc.cbClsExtra = 0; 18 wc.cbWndExtra = 0; 19 wc.hInstance = hInstance; 20 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 21 wc.hCursor = LoadCursor(NULL, IDC_ARROW); 22 wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); 23 wc.lpszMenuName = NULL; 24 wc.lpszClassName = szAppName; 25 26 if (!RegisterClass(&wc)) return 0; 27 28 hwnd = CreateWindow( 29 szAppName, TEXT(""), 30 WS_OVERLAPPEDWINDOW, 31 CW_USEDEFAULT, CW_USEDEFAULT, 32 CW_USEDEFAULT, CW_USEDEFAULT, 33 NULL, NULL, 34 hInstance, NULL); 35 36 if (!hwnd) return 0; 37 38 ShowWindow(hwnd, nCmdShow); 39 UpdateWindow(hwnd); 40 41 while (GetMessage(&msg, NULL, 0, 0) > 0) { 42 TranslateMessage(&msg); 43 DispatchMessage(&msg); 44 } 45 46 return msg.wParam; 47} 48 49LRESULT CALLBACK WndProc( 50 HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 51{ 52 HDC hdc; 53 PAINTSTRUCT ps; 54 55 switch (uMsg) { 56 57//case WM_PAINT:の部分がなければ正しく動く 58 59 case WM_PAINT: 60 hdc = BeginPaint(hwnd, &ps); // 描画開始 61 Rectangle(hdc, 50, 50, 200, 150); // 描画 62 EndPaint(hwnd, &ps); // 描画終了 63 return 0; 64 65 case WM_DESTROY: 66 PostQuitMessage(0); 67 return 0; 68 } 69 70 return DefWindowProc(hwnd, uMsg, wParam, lParam); 71}

error

1g++ -g -o "C:\Users\sample.exe" "C:\Users\sample.cpp" 2c:/program files/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\(ユーザー名)\AppData\Local\Temp\ccwXLs9Y.o: in function `WndProc(HWND__*, unsigned int, unsigned long long, long long)': 3C:\Users\sample.cpp:16: undefined reference to `__imp_SetPixel' 4collect2.exe: error: ld returned 1 exit status

すでに行ったこと

  • gccでコンパイルする
    元ソースがCで書かれているためg++以外でもコンパイルしましたがどちらも同様のエラーが発生しました。

  • -m64, -mwindows, -m32 などのオプションを入れてコンパイルしてみる

unrecognised emulation mode: windows.exe Supported emulations: i386pep i386pe

と別のエラーが発生しコンパイルできませんでした。

  • minGW上にwindows.hやwingdi.hなどのヘッダファイルが存在するか確認する
    どちらもmingw64\x86_64-w64-mingw32\include上に存在しました

補足

OSはwindows10
gccのバージョンはgcc (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders) 11.2.0
です

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

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

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

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

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

guest

回答1

0

ベストアンサー

https://docs.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-setpixel
Library Gdi32.lib
ということで、リンクする時にgdi32.libの指定が必要かと。

https://stackoverflow.com/questions/16546371/how-to-add-gdi32-lib-from-command-line
-lgdi32
のオプションが必要でしょうか。

投稿2022/02/27 07:52

setoppu

総合スコア292

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

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

fk_beginner

2022/02/27 08:03

動きました!! 素早い回答ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問