2016-11-19 12 views
0

У меня возникла проблема с включением gdi32.lib в мой проект C на окнах. Ошибка возникает в следующем фрагменте кода:Как правильно добавить gdi32.lib в файл?

#include <windows.h> 
#pragma comment(lib, "kernel32.lib") 
#pragma comment(lib, "user32.lib") 
#pragma comment(lib, "gdi32.lib") 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 
    WNDCLASSEX wcx; 
    wcx.hbrBackground = CreateSolidBrush(0x000000); 
    .... 
} 

Когда я компилирую с опцией -lgdi32, все работает так же, как и ожидалось, в то время как я получаю ошибку компиляции с помощью следующей команды:

C:\projects\cpp>c++ project.cpp 
    C:\Users\LUKASW~1\AppData\Local\Temp\ccSKc5qg.o:project.cpp:(.text+0xe0): 
     undefined reference to `__imp_CreateSolidBrush' 
    collect2.exe: error: ld returned 1 exit status 

Есть путь к связывает библиотеки непосредственно в файле, а не передает его компилятору каждый раз?


Вот урезанная версия для отладки:

#include <windows.h> 
#pragma comment(lib, "kernel32.lib") 
#pragma comment(lib, "user32.lib") 
#pragma comment(lib, "gdi32.lib") 

static char szWindowClass[] = "debugging"; 
static char szTitle[] = "gdi32.lib test"; 

HINSTANCE hInst; 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 

void GetDesktopResolution(int& w, int& h) { 
    RECT desktop; 
    GetWindowRect(GetDesktopWindow(), &desktop); 
    w = desktop.right; 
    h = desktop.bottom; 
} 

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { 
    WNDCLASSEX wcx; 

    wcx.cbClsExtra  = 0; 
    wcx.cbSize   = sizeof(WNDCLASSEX); 
    wcx.cbWndExtra  = 0; 
    wcx.hbrBackground = CreateSolidBrush(0x000000); 
    wcx.hCursor  = LoadCursor(NULL, IDC_ARROW); 
    wcx.hIcon   = LoadIcon(hInst, IDI_APPLICATION); 
    wcx.hIconSm  = LoadIcon(wcx.hInstance, IDI_APPLICATION); 
    wcx.hInstance  = hInst; 
    wcx.lpfnWndProc = WndProc; 
    wcx.lpszClassName = szWindowClass; 
    wcx.lpszMenuName = NULL; 
    wcx.style   = CS_HREDRAW | CS_VREDRAW; 

    RegisterClassEx(&wcx); 

    int x, y, 
     w = 600, 
     h = 600; 
    GetDesktopResolution(x, y); 

    HWND hWnd = CreateWindowEx(WS_EX_APPWINDOW, szWindowClass, szTitle, WS_POPUP, (x - w)/2, (y - h)/2, w, h, NULL, NULL, hInst, NULL); 

    ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 

    MSG msg; 
    while(GetMessage(&msg, NULL, 0, 0)) { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return (int) msg.wParam; 
} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { 
    switch (message) { 
     case WM_PAINT: 
      // empty 
      break; 
     case WM_DESTROY: 
      PostQuitMessage(0); 
      break; 
     default: 
      return DefWindowProc(hWnd, message, wParam, lParam); 
      break; 
    } 

    return 0; 
} 

ответ

1

#pragma comment(lib, ...) является MS Visual C/C++ Прагма. Вы используете MinGW, который не поддерживает эту директиву.

Из того, что я читал на this question, GCC и G ++ не имеют эквивалентной прагмы, поэтому вам придется придерживаться опции -l.

+0

Спасибо за ваш ответ, вы правы. Тогда я буду придерживаться опции -l'. – Wip