2016-07-11 2 views
0

Я попытался скомпилировать этот код:ошибка LNK1120: 1 неразрешенный внешний - VS13 C

#include <windows.h> 
#include <commctrl.h> 


#define ID_TABCTRL 1 
#define ID_EDIT 2 
#define BTN_ADD 3 
#define BTN_DEL 4 
#define BTN_CLR 5 
#define MAX_TAB_LEN 15 

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
HWND hTab, hEdit; 

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    PWSTR pCmdLine, int nCmdShow) { 

    MSG msg; 
    WNDCLASSW wc = { 0 }; 
    wc.lpszClassName = L"Tab control"; 
    wc.hInstance = hInstance; 
    wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE); 
    wc.lpfnWndProc = WndProc; 
    wc.hCursor = LoadCursor(0, IDC_ARROW); 

    RegisterClassW(&wc); 
    CreateWindowW(wc.lpszClassName, L"Tab control", 
     WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
     100, 100, 380, 230, 0, 0, hInstance, 0); 

    while (GetMessage(&msg, NULL, 0, 0)) { 

     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return (int)msg.wParam; 
} 

WINCOMMCTRLAPI BOOL WINAPI InitCommonControlsEx(_In_ const INITCOMMONCONTROLSEX *picce); 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, 
    WPARAM wParam, LPARAM lParam) { 

    TCITEMW tie; 
    wchar_t text[4]; 
    LRESULT count, id; 
    INITCOMMONCONTROLSEX icex; 

    switch (msg) { 

    case WM_CREATE: 

     icex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
     icex.dwICC = ICC_TAB_CLASSES; 
     InitCommonControlsEx(&icex); 

     hTab = CreateWindowW(WC_TABCONTROLW, NULL, WS_CHILD | WS_VISIBLE, 
      0, 0, 200, 150, hwnd, (HMENU)ID_TABCTRL, NULL, NULL); 

     hEdit = CreateWindowW(WC_EDITW, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER, 
      250, 20, 100, 25, hwnd, (HMENU)ID_EDIT, NULL, NULL); 

     SendMessage(hEdit, EM_SETLIMITTEXT, MAX_TAB_LEN, 0); 

     CreateWindowW(WC_BUTTONW, L"Add", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
      250, 50, 100, 25, hwnd, (HMENU)BTN_ADD, NULL, NULL); 

     CreateWindowW(WC_BUTTONW, L"Delete", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
      250, 80, 100, 25, hwnd, (HMENU)BTN_DEL, NULL, NULL); 

     CreateWindowW(WC_BUTTONW, L"Clear", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
      250, 110, 100, 25, hwnd, (HMENU)BTN_CLR, NULL, NULL); 
     break; 

    case WM_COMMAND: 

     switch (LOWORD(wParam)) { 

     case BTN_ADD: 

      GetWindowTextW(hEdit, text, 250); 

      if (lstrlenW(text) != 0) { 

       tie.mask = TCIF_TEXT; 
       tie.pszText = text; 
       count = SendMessageW(hTab, TCM_GETITEMCOUNT, 0, 0); 
       SendMessageW(hTab, TCM_INSERTITEMW, count, 
        (LPARAM)(LPTCITEM)&tie); 
      } 
      break; 

     case BTN_DEL: 

      id = SendMessageW(hTab, TCM_GETCURSEL, 0, 0); 

      if (id != -1) { 

       SendMessageW(hTab, TCM_DELETEITEM, 0, id); 
      } 
      break; 

     case BTN_CLR: 

      SendMessageW(hTab, TCM_DELETEALLITEMS, 0, 0); 
      break; 
     } 
     break; 

    case WM_DESTROY: 

     PostQuitMessage(0); 
     break; 
    } 

    return(DefWindowProcW(hwnd, msg, wParam, lParam)); 
} 

и, кажется, как этот libary:

#include <commctrl.h> 

дает мне следующую ошибку:

error LNK2019: unresolved external symbol  [email protected] referenced in function [email protected] C:\Users\User\Desktop\Magshimim\Magshimim EX1\Magshimim EX1\01.obj Magshimim EX1 

сейчас код код примера: http://zetcode.com/gui/winapi/advancedcontrols/

так что я понял, что что-то не так с моим компилятором ... Может ли кто-нибудь помочь мне найти проблему и исправить ее?

Редактировать: вопрос не является дубликатом, потому что реферируемый дубликат говорит очень общим образом о самой ошибке, а в качестве новичка у меня нет навыков для создания правильного ответа от такого вопроса, и поскольку этот код были использованы многими людьми, которые проверяют пример, который я считаю своим импотентом, чтобы задать конкретный вопрос.

+0

Вы связали библиотеку 'Comctl32.lib', как указано в' InitCommonControlsEx' [документации] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb775697.aspx)? – dxiv

ответ

3

Либо добавьте #pragma comment(lib, "comctl32.lib"), либо настройте параметры компоновщика для ссылки на comctl32.lib.

Вы можете проверить таблицу в нижней части функции MSDN article, чтобы узнать, в какой библиотеке вы должны установить ссылку. Каждое приложение Windows связано с kernel32.dll и каждым графическим интерфейсом с user32.dll. Все остальное должно быть указано явно 1.


1 Есть исключения, проверьте IInspectable's comment below.

+1

* «Все остальное должно быть указано явно». * - Это неверно. Созданное мастером приложение Win32 по умолчанию в ссылках Visual Studio связано с большим количеством LIB (например, * gdi32.lib *, * comdlg32.lib *, * shell32.lib *). И тогда есть библиотеки, которые неявно связаны через их заголовочные файлы (например, * SAPI.Lib * через * sapi.h *). Хотя обычно не больно явно указывать зависимости компоновщика, это не всегда требуется. – IInspectable

+0

@Inpectable Я использую MinGW и не думал о Wizard-связанных LIB. Я отредактировал ответ, чтобы сослаться на ваш комментарий. Благодаря :) – a3f