Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55

Unresolved external symbol

12.12.2016, 21:38. Показов 931. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читаю книгу по программированию в MFC, хоть она и 13летней давности
В общем дошол до создания окна через Resource и создание класса для окна.
При линковке выдает следующие 2 ошибки:
Кликните здесь для просмотра всего текста

Error 1 error LNK2019: unresolved external symbol "public: __thiscall CMyDialog::CMyDialog(unsigned int,class CWnd *)" (??0CMyDialog@@QAE@IPAVCWnd@@@Z) referenced in function "public: void __thiscall CMainWnd::OnRButtonDblClk(unsigned int,class CPoint)" (?OnRButtonDblClk@CMainWnd@@QAEXIVCPoint @@@Z) E:\Visual Studio 2013\Projects\MFCDemo\ConsoleApplication 1\Main.obj Создание окна в Win32 Application

Кликните здесь для просмотра всего текста

Error 2 error LNK1120: 1 unresolved externals E:\Visual Studio 2013\Projects\MFCDemo\Debug\Создание окна в Win32 Application.exe Создание окна в Win32 Application


Все что я смог выяснить, это то что ошибка рождается в конструкторе класса данного окна,
самый первый класс сверху.
Не обращайте внимание на коменты в коде, писал для себя.
Вот код:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
#include <afxwin.h>     // MFC Основные и стандартные компоненты
#include <afxext.h>     //Расширения для MFC
#include "resource.h"   //Здесь хранятся идентификаторы
 
#define IDC_MYBUTTON 100    //Идентификатор кнопки
#define IDC_MYEDIT 102      //Идентификатор поля редактирования
#define IDC_LIST1  106
 
//Создаем класс для нового окна
class CMyDialog : public CDialog
{
public:
    CMyDialog(UINT nIDTemplate, CWnd* pParentWnd = NULL);
    virtual BOOL OnInitDialog();
    virtual void OnOk();
    CString GetString();
private:
    CListBox *cListBox;
    CString cDate;
};
 
CString CMyDialog::GetString()
{
    return cDate;
}
 
void CMyDialog::OnOk()
{
    if (cListBox->GetCurSel() == LB_ERR)
    {
        AfxMessageBox(L"Select Item List Box");
    }
    else
    {
        CString buffer;
        cListBox->GetText(cListBox->GetCurSel(), buffer);
        /*cDate = buffer;*/
        CDialog::OnOK();
    }
}
 
BOOL CMyDialog::OnInitDialog()
{
    CDialog::OnInitDialog();
    CenterWindow();
    CRect rect(10, 10, 100, 100);
    cListBox = new CListBox();
    cListBox->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | LBS_NOTIFY | WS_VSCROLL | WS_BORDER, rect, this, IDC_LIST1);
    cListBox->AddString(L"God");
    cListBox->AddString(L"Bad");
    cListBox->AddString(L"VOID");
    return TRUE;
}
 
//Создаем свой CPainDC
class CMyPaintDC: public CPaintDC
{
public:
    CMyPaintDC(CWnd* pWnd);                 //Конструктор по умолчанию
    void DrawCross(int iPosX, int iPosY);   //Метод рисующий крест
};
 
CMyPaintDC::CMyPaintDC(CWnd* pWnd) : CPaintDC(pWnd) {}  //Реализация конструктора по умолчанию, передаем параметры конструктору родительского класса
 
void CMyPaintDC::DrawCross(int iPosX, int iPosY)    //Реализация метода рисующего крест
{
    MoveTo(iPosX - 50, iPosY);
    LineTo(iPosX + 50, iPosY);
    MoveTo(iPosX, iPosY - 50);
    LineTo(iPosX, iPosY + 50);
}
 
class CMyButton : public CButton
{
public:
    afx_msg void OnLButtonDblClk(UINT, CPoint);
    afx_msg void OnRButtonDblClk(UINT, CPoint);
private:
    DECLARE_MESSAGE_MAP();  //Таблица откликов кнопки
};
 
BEGIN_MESSAGE_MAP(CMyButton, CButton)
    ON_WM_LBUTTONDBLCLK()
    ON_WM_RBUTTONDBLCLK()
    END_MESSAGE_MAP()
 
    void CMyButton::OnLButtonDblClk(UINT, CPoint)
    {
        //Данная соманда вызывается от родительского класса CWnd данного обьекта
        //Если вызывать не от обьекта, то функция принимает 6 параметров, 4 из которых щас передаются в функцию CRect
        //Первым параметром будет дискриптор окна(обьекта) который требуется перерисовать
        MoveWindow(CRect(120, 100, 220, 150), TRUE);    //Перерисовывает текущий обьект в указанные координаты
    }
 
    void CMyButton::OnRButtonDblClk(UINT, CPoint)
    {
        MoveWindow(CRect(120, 10, 220, 50), TRUE);  //Перерисовывает текущий обьект в указанные координаты   
    }
    
 
class CMainWnd : public CFrameWnd
{
public:
    CMainWnd(); // Конструктор по умочанию
    afx_msg void OnLButtonDblClk(UINT, CPoint); //Виртуальная процедура ответа на левую кнопку
    afx_msg void OnRButtonDblClk(UINT, CPoint); //Виртуальная процедура ответа на правую кнопку
    afx_msg void OnKeyDown(UINT, UINT, UINT);   //Виртуаьная процедура ответа на клавишу
    //afx_msg - можно воспринимать как аналог virtual
    int OnCreate(LPCREATESTRUCT lpCreateStruct); //Данная функция вызывается при создании окна обьекта данного класса, не является виртуальной
    //Данную функцию необходимо обьявлять в классе в котором и будем обрабатывать и в котором есть обработчик событий
    void MenuExit();            //Процедура реакции на нажатие Exit в меню File
    afx_msg void OnPaint();     //Переопределяем функцию рисования в окне
    
private:
    CStatusBar m_wndStatusBar;  //Панель состояния
    //Идентификатор обьекта надписи явно необьявлен в начале в #define, он просто задан по умолчанию как 0xffff
    CStatic* MyStatic;  //Указатель на обьект надпись
    CMyButton* MyButton;    //Указатель на обьект кнопка
    CEdit* MyEdit;      //Указатель на обьект поле редактирования
    CMenu m_wndMenu;    //Меню
 
    //Добавление данного макроса в класс говорит о том, что данный класс будет реагировать на события
    DECLARE_MESSAGE_MAP();
};
 
//Если класс реагирует на события, то необходимо описать таблицу откликов на них, описание событий начинается с ON_WM_message - это события Windows
//таблица откликов на сообщения
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)  //Первый параметр "Класс реагирующий на событие", второй параметр "Класс родитель реагирующего на события"
    //Класс родителя необходим для обработки стандартных сообщений, даже если вы их явно не обрабатываете, например закрыть приложение.
    ON_WM_LBUTTONDBLCLK()               //реакция на нажатие левой кнопки мыши
    ON_WM_RBUTTONDBLCLK()               //реакция на нажатие правой кнопки мыши
    ON_WM_KEYDOWN()                     //реакция на нажатие клавиши
    ON_WM_CREATE()                      //Событие создания окна
    //Обработка реакции на выбор Exit в меню File
    ON_COMMAND(ID_FILE_EXIT, MenuExit)  //Первым параметром является идентификатор обьекта, вторым функция которая будет выполнятся
                                        //функция должна пренадлежать классу, чьей эта таблица откликов является
                                        //Макрос ON_COMMAND предназначен для обработки команд меню
    ON_WM_PAINT()
END_MESSAGE_MAP()
 
void CMainWnd::OnPaint()
{
    //CPaintDC dc(this);                                //Получить контекст устройства
    //dc.TextOutW(200, 200, L"Привет MFC Программа");    //Написать в нем привет
    //dc.MoveTo(300, 300);                          //Начать рисовать линию
    //dc.LineTo(600, 105);                          //И продолжить рисовать линию                       
    //dc.SetPixel(200, 200, RGB(255, 0, 0));            //Красный пиксель, над буквой "П" слева, чем выше разрешение экрана тем меньше пиксель
    //dc.Arc(200, 200, 100, 100, 400, 400, 10, 10); //Дуга окружности
    //dc.Chord(200, 200, 100, 100, 400, 400, 10, 10); //Замкнутая дуга (перекрывает дугу описанную выше)
    //dc.Ellipse(200, 200, 50, 250);                    //Элипс
 
    //dc.MoveTo(350, 350);      //Линия начало
    //dc.LineTo(400, 400);      //Линия конец
 
    CMyPaintDC dc(this);
    //Создаем перо
    CPen MyPen(PS_DASHDOT, 1, RGB(0, 255, 0));  //PS_DASHDOT - пунктир, 1 - толщина линии, RGB - цвет линии
    dc.SelectObject(&MyPen);    //Говорим что нужно рисовать пером
    for (int x = 1; x < 400; x = x + 100)   //Нарисуем 4 креста по диагонали
        dc.DrawCross(100 + x, 100 + x);
}
 
void CMainWnd::MenuExit()
{
    DestroyWindow();    //Уничтожить окно, возвращает значение типа BOOL, окно не всегда можно уничтожить
}
 
int CMainWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)  //Если -1 то окно не создано
        return -1;
    //Статическое включение статусбара при создании рамки окна
    m_wndStatusBar.Create(this);    //В качестве параметра принимает указатель на обьект(куда вставлять, кто будет владеть создаваемым обьектом)
 
    //Загрузить меню из файла ресурса, в качестве параметра принимает идентификатор (уже созданного внешнего вида меню)
    m_wndMenu.LoadMenuW(IDR_MENU);  //LoadMenuW возвращает значение типа BOOL указывающее на успех операции
    SetMenu(&m_wndMenu);            //Установить меню, в качестве параметра принимает адресс класса типа CMenu
    return 0;
}
 
CMainWnd::CMainWnd()
{
    Create(NULL, L"Окно", WS_OVERLAPPEDWINDOW, rectDefault,
        NULL, NULL); // Создать окно программы
    //Создаем обьекты при создании класса
    MyStatic = new CStatic();   //Обьект надпись(выделяем под него память)
    //Чтобы писать латинскими буквами, необходимо перед полем сообщение ставить "L"
    MyStatic->Create(L"Мое сообщение", WS_CHILD | WS_VISIBLE | SS_CENTER, CRect(10, 10, 100, 50), this);    //Создаем обьект надпись
    MyButton = new CMyButton(); //Обьект кнопка(выделяем под него память)
    MyButton->Create(L"Кнопарь", WS_CHILD | WS_VISIBLE | SS_CENTER, CRect(120, 10, 220, 50), this, IDC_MYBUTTON);    //Создаем обьект кнопка
    MyEdit = new CEdit();       //Обьект поле редактирования(выделяем под него память)
    MyEdit->Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(240, 10, 340, 50), this, IDC_MYEDIT);   //Создаем обьект поле редактирования
    //Функция Create используется очень часто и есть у многих обьектов. Обычно она требует:
    //1. Строку для имени или надписи.
    //2. Стиль.
    //3. Размеры и положение.
    //4. Куда вставлять.
    //5. Идентификатор
    //this - означает что вставлять туда где находишся(мы в классе рамки окна)
}
 
void CMainWnd::OnKeyDown(UINT, UINT, UINT)
{
    AfxMessageBox(L" Key Button Down ");
}
 
void CMainWnd::OnRButtonDblClk(UINT, CPoint)
{
    CMyDialog about(IDD_DIALOG1);
    if (about.DoModal() == IDOK)
        AfxMessageBox(about.GetString());
    //CDialog about(IDD_DIALOG_ABOUT);
    //if (about.DoModal() == IDOK) AfxMessageBox(L"Ок");  //DoModal возвращает код нажатой клавищи(что было нажато перед закрытием окна)
    //else AfxMessageBox(L"Отмена");
}
 
void CMainWnd::OnLButtonDblClk(UINT, CPoint)
{
    //Создаем новое меню через Add -> Resourse -> Menu
    //В новом меню также создаем Файл -> Выход, идентификатор обьекту "Выход" присваиваем такойже как и у старого меню "IDR_FILE_EXIT"
    //Это чтобы не переписывать таблицу откликов
    m_wndMenu.DestroyMenu();            //Уничтожаем старое меню(текущее меню)
    m_wndMenu.LoadMenuW(IDR_MENU1);     //Читаем новое меню
    SetMenu(&m_wndMenu);                //Устанавливаем меню
    /*На эту тему можно фантазировать.Например, меню на английском, немецком, французком на выбор ? Или меню, которое постоянно изменяется при разных условиях.Или конкретное меню под конкретное рабочее место, под паролем на основании меню, в котором есть всё ?*/
}
 
class CMyApp : public CWinApp
{
 
public:
    CMyApp(); // конструктор по умолчанию
    virtual BOOL InitInstance(); // стандартная инициализация
};
 
CMyApp::CMyApp() // конструктор главного класса приложения
{}
 
BOOL CMyApp::InitInstance() // стандартная инициализация
{
    m_pMainWnd = new CMainWnd();    //Создать ообьект производный от CMainWnd и присвоить указателю m_pMainWnd фдресс этого обьекта
    ASSERT(m_pMainWnd);         //Проверить указатель на корректность
    m_pMainWnd->ShowWindow(SW_SHOW); // Показать окно
    m_pMainWnd->UpdateWindow(); // Обновить окно
    return TRUE; // Вернуть что все нормально 
};
 
CMyApp theApp; // запуск приложения
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2016, 21:38
Ответы с готовыми решениями:

Unresolved external symbol, unresolved token
Всем привет. У меня тут такое дело: // learncpp.cpp : main project file. #include &quot;stdafx.h&quot; int main() { const int...

Unresolved external symbol
Я понимаю что ошибка LNK2019 обычно означает что есть объявление функции, но нет ее тела. В моем случае у меня как то через раз это...

Unresolved external symbol
В общем, стандартная ошибка линкера: 5&gt;lib1.lib(a.obj) : error LNK2001: неразрешенный внешний символ &quot;_lol&quot; В a.c...

3
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
12.12.2016, 21:41
Цитата Сообщение от Chronid Посмотреть сообщение
CMyDialog(unsigned int,class CWnd *)
В классе CMyDialog такой конструктор объявлен, но код для него написать Вы забыли.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12935 / 6802 / 1821
Регистрация: 18.10.2014
Сообщений: 17,215
12.12.2016, 22:11
Цитата Сообщение от Chronid Посмотреть сообщение
Все что я смог выяснить, это то что ошибка рождается в конструкторе класса данного окна,
Что значит "рождается в конструкторе"? Компилятор (линкер) вам говорит открытым текстом, что в строке 13 вы пообещали написать такой конструктор, но не написали его. Где сам конструктор-то?

Поэтому "рождаться в конструкторе" ошибка никак не может. Ошибка в том, что определения конструктора просто нет.
1
2 / 2 / 0
Регистрация: 23.03.2015
Сообщений: 55
12.12.2016, 22:25  [ТС]
Вот это я лоханулся...
Я точно помню что писал его, что в нем пустой указатель передается в конструктор родительского класса.
Похоже какимто макаром случайно удалил конструктор...

Добавлено через 6 минут
Всем спасибо и + в карму
Вот этого нехватало, как написал я выше, я както удалил его:
C++
1
CMyDialog::CMyDialog(UINT nIDTemplate, CWnd* pParentWnd) : CDialog(nIDTemplate, pParentWnd) {}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2016, 22:25
Помогаю со студенческими работами здесь

Unresolved external symbol
Чем больше я сталкиваюсь с этой ошибкой и чем больше решаю её, тем непонятнее она становится. Скопировал код из одного проекта VS в другой,...

Unresolved external symbol
policy.h #ifndef POLICY_H #define POLICY_H #include &lt;forward_list&gt; #include &quot;vector.h&quot; struct PolicyVector ...

unresolved external symbol
Доброе время собственно не понимаю почему компилатор ругается. Файлы : main.cpp #include &quot;Header.h&quot; #include...

Unresolved external symbol
Error 1 error LNK2001: unresolved external symbol &quot;public: void __thiscall Lab3::HashTable::addElement(char *,char *,float)&quot;...

unresolved external symbol
Добрый день. :) Стоит задача разработать шаблонный класс комплексных чисел. Одним из пунктов является решение квадратного уравнения с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru