Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
#1

undefined reference to `variable` - C++

26.11.2011, 18:49. Просмотров 1655. Ответов 18
Метки нет (Все метки)

Вобщем то есть заголовочный файл main.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef _MAIN_H
#define _MAIN_H
 
#include <vector>
#include <windows.h>
 
using std::vector;
 
extern vector<char*>  list;
extern HINSTANCE      hInst;
extern HWND           Static, Threads, ip, Port, Method;
 
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
#endif
И файл WndProc.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include "main.h"
#include "function.h"
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    char *IP = GetText(ip);
    char *PORT = GetText(Port);
    char *THREADS = GetText(Threads);
    char *METHOD = GetText(Method);
    // функция выглядит так char *GetText(HWND &);
 /* ... */
}
Ну и при компиляции
Код
obj\Release\WndProc.o:WndProc.cpp undefined reference to `ip'
obj\Release\WndProc.o:WndProc.cpp undefined reference to `Port'
//и так по всем переменым
Это появилось после того как решил вынести функцию WndProc в отдельный файл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2011, 18:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос undefined reference to `variable` (C++):

Странная ошибка: [Linker error] undefined reference to `__dyn_tls_init_callback' [Linker error] undefined reference to ld returned 1 exit status - C++
Здравствуйте. Вот недавно начал изучать книгу &quot;С++ для чайников&quot; Стефан Р. Девис 4-е издание. И напоролся на кучу ошибок) Но смог все...

Problem with passing a list variable by a reference - C++
Здравствуйте. Не знал, как нормально сформулировать заглавие на русском! :D В общем такая проблема. Есть C++ Win32 Empty Project...

undefined reference - C++
Пытаюсь разобраться с Box2D. Выпадает куча ошибок типа undefined reference to `b2World::b2World(b2Vec2 const&amp;)'| Box2D.h файл...

undefined reference - C++
Доброго времени суток! Есть следующий код: #include &lt;iostream&gt; using namespace std; enum direction {Up, Down, Left, Right}; ...

undefined reference to - C++
http://www.cyberforum.ru/qt/thread861722.html Не в том разделе создал тему, и поэтому даю линк на неё. Описание ошибки там же

Undefined reference to - C++
Много уже тем создано по даннму вопросу, но решения так и не нашел.. Есть конечно догадки, но как реализовать все равно не знаю. Прошу...

18
Байт
Эксперт C
16143 / 10421 / 1552
Регистрация: 24.12.2010
Сообщений: 19,726
26.11.2011, 18:54 #2
OrmaJever, В одном из модулей проекта надо внешние переменные объявить без extern, а во всех остальных с extern
1
Сыроежка
Заблокирован
26.11.2011, 18:58 #3
OrmaJever,

Потому что вы нигде не определили эти переменные. Компилятор видет их объявление, но не знает их определения.

Добавлено через 2 минуты
Цитата Сообщение от Байт Посмотреть сообщение
OrmaJever, В одном из модулей проекта надо внешние переменные объявить без extern, а во всех остальных с extern
Ничего подобного! Можно во всех модулях объявить переменную с extern. Гланое - это определить ее в каком-нибудь модуле, например,

C++
1
extern HWND ip = 0;
0
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
26.11.2011, 18:59  [ТС] #4
Байт, извините я не понял. Если в main.h обьявлять без extern топотом в многих местах ругается на многократное определение.
0
Сыроежка
Заблокирован
26.11.2011, 19:01 #5
Цитата Сообщение от OrmaJever Посмотреть сообщение
Байт, извините я не понял. Если в main.h обьявлять без extern топотом в многих местах ругается на многократное определение.
Уважаемый, я же вам все написал. Что же вы обращаетесь к этому Байт, когда тот сам толком не знает?!
0
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
26.11.2011, 19:02  [ТС] #6
Цитата Сообщение от Сыроежка Посмотреть сообщение
Гланое - это определить ее в каком-нибудь модуле, например,

C++
1
extern HWND ip = 0;
но они определяются только в main.cpp
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
#include "function.h"
#include "main.h"
 
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nCmdShow)
{
    MSG messages;
    WNDCLASSEX wincl;
    hInst = hThisInstance;
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_HREDRAW | CS_VREDRAW;
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = NULL;
    wincl.hIconSm = LoadIcon (NULL, IDI_HAND);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH)COLOR_MENU;
 
 
    if (!RegisterClassEx (&wincl))
        return 0;
 
    HWND hwnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,szClassName,"aaa",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,300,HWND_DESKTOP,NULL,hThisInstance,NULL);
    ip = CreateWindow("EDIT", 0, WS_BORDER | WS_VISIBLE | WS_CHILD, 33,10,120,20, hwnd, 0, hThisInstance, NULL);
    Port = CreateWindow("EDIT", 0, WS_BORDER | WS_VISIBLE | WS_CHILD, 205,10,50,20, hwnd, 0, hThisInstance, NULL);
    Threads = CreateWindow("EDIT", 0, WS_BORDER | WS_BORDER | WS_VISIBLE | WS_CHILD, 72,40,50,22, hwnd, 0, hThisInstance, NULL);
    Method = CreateWindow("COMBOBOX", 0, CBS_DROPDOWNLIST | WS_VISIBLE | WS_CHILD, 185,40,70,80, hwnd, 0, hThisInstance, NULL);
    Static = CreateWindow("STATIC", 0, WS_BORDER | WS_VSCROLL | WS_VISIBLE | WS_CHILD, 10,70,360,180, hwnd, 0, hThisInstance, NULL);
/* ... */
}
и как же быть?
0
Сыроежка
Заблокирован
26.11.2011, 19:09 #7
Что вы тащите кишку кода?! Как следует из вашего первоначального сообщения, вы объявления этих переменных поместили в заголовочный файл. И у вас теперь, как я понимаю, по крайней мере две единицы трансляции видят эти объявления, так? Ну тогда редактор связей не знает, в какой единице трансляции имеется определение этих переменных. Где определение этих переменных, а где их только использование без определения. Разницу между объявлением объекта и определением объекта понимаете?
0
Байт
Эксперт C
16143 / 10421 / 1552
Регистрация: 24.12.2010
Сообщений: 19,726
26.11.2011, 19:12 #8
Цитата Сообщение от Сыроежка Посмотреть сообщение
Уважаемый, я же вам все написал. Что же вы обращаетесь к этому Байт, когда тот сам толком не знает?!
Спасибо. Вы очень добры.

Добавлено через 1 минуту
Пожалуй, тем, в которых такая вежливая публика, стоит избегать...
2
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
26.11.2011, 19:21  [ТС] #9
Цитата Сообщение от Сыроежка Посмотреть сообщение
Что вы тащите кишку кода?! Как следует из вашего первоначального сообщения, вы объявления этих переменных поместили в заголовочный файл. И у вас теперь, как я понимаю, по крайней мере две единицы трансляции видят эти объявления, так?
Ну так, WndProc.cpp компилируется отдельно, main.cpp отдельно.
Цитата Сообщение от Сыроежка Посмотреть сообщение
Ну тогда редактор связей не знает, в какой единице трансляции имеется определение этих переменных. Где определение этих переменных, а где их только использование без определения.
Ну вот я и пытаюсь обьявить, но как сказать что используемая переменая в WndProc.cpp отпределяется в main.cpp?
Цитата Сообщение от Сыроежка Посмотреть сообщение
Разницу между объявлением объекта и определением объекта понимаете?
Можно сказать уже понимаю, но ещё бы разок послушал разницу.

Добавлено через 4 минуты
Опишу ситуацию вот так
main.h
C++
1
TYPE variable; // обьявление
main.cpp

C++
1
2
#include "main.h"
variable = some_function(param) // определение
WndProc.cpp
C++
1
2
#include "main.h"
other_function(variable); // использование
Но main.cpp и WndProc.cpp компилируются отдельно, как связать эту переменую?
0
Сыроежка
Заблокирован
26.11.2011, 19:34 #10
Цитата Сообщение от OrmaJever Посмотреть сообщение
Ну так, WndProc.cpp компилируется отдельно, main.cpp отдельно.

Ну вот я и пытаюсь обьявить, но как сказать что используемая переменая в WndProc.cpp отпределяется в main.cpp?

Можно сказать уже понимаю, но ещё бы разок послушал разницу.

Добавлено через 4 минуты
Опишу ситуацию вот так
main.h
C++
1
TYPE variable; // обьявление
main.cpp

C++
1
2
#include "main.h"
variable = some_function(param) // определение
WndProc.cpp
C++
1
2
#include "main.h"
other_function(variable); // использование
Но main.cpp и WndProc.cpp компилируются отдельно, как связать эту переменую?
Я вам сейчас подробно все объясню. Дело в том, когда в списке спецификаций стоит слово extern для объекта, но сам объект не инициализируется, то это является объявлением объекта, но не его определением. Ежеди присутствует выражение инициализации, то тогда это является опредеением.

Для примера

C++
1
extern int x;  // Это объявление объекта с именем x
C++
1
extern int x = 0;  // Это определение объекта с именем x
Поэтому когда вы во все модули включаете предложение

C++
1
extern HWND ip;
то во всех модулях вы лишь объявили переменную, сказав, что это есть некоторая внешняя переменная.

Естественно компилятор не знает, а гед же эта переменная определена, в каком модуле.

Давайте рассмотрим другой пример. Во все модули вы включили в глобальное пространство имен предложение

C++
1
HWND ip;
Это уже опредеение переменной. Тогда ситуация возникнет другая. Редактор связей увидет несколько определений одного и того же имени. И также сообщит об ошибке.

Как тогда поступить?

Вы в заголовочном файле оставляете свое объявление

C++
1
extern HWND ip;
Но в файле с main вы дополнительно вставляете строку

C++
1
HWND ip;
или

C++
1
extern HWND  ip = 0;
1
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
26.11.2011, 20:14 #11
OrmaJever, я делаю так.
В Хедере пишу
C
1
2
3
4
5
6
#if defined _E
#define _EX extern
#else
#define _EX
#endif
_EX HWND ip, ....
Теперь в одном из файлов проекта (обычно в главном, но это не обязательно) пишу до всех своих хедеров
C
1
#define _E
До сих пор ни разу не подводило
2
Сыроежка
Заблокирован
26.11.2011, 20:55 #12
Day,

Проблема в том, что это усложняет код, так как теперь 1) надо помнить, какие манифестные константы надо объявлять перед включением того или иного заголовочного файла; 2) может быть коллизия заголовочных файлов, у которых определен такой же макрос, а потому поведение кода будет непредсказуемым; 3) это усложняет сопровождение кода.
0
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
26.11.2011, 21:13 #13
Цитата Сообщение от Сыроежка Посмотреть сообщение
Day,

1) надо помнить, какие манифестные константы надо объявлять перед включением того или иного заголовочного файла;
Эта константа у меня почти едиственная. Запомнить ее легко. Включаю только в главный файл проекта (там где main) И забываю о ней.
2) может быть коллизия заголовочных файлов, у которых определен такой же макрос, а потому поведение кода будет непредсказуемым;
Помещаю свои хедеры за системными. Свой #define ставлю перед своими хедерами. С моими макросами это в конфликт надеюсь не войдет. Я же сторож коду своему.
3) это усложняет сопровождение кода.
За 20 лет использования этой техники пришлось сопровождать несколько десятков проектов с пересекающимся множеством исходников - и ничего.
4) Я никому не навязываю своего подхода.
2
Сыроежка
Заблокирован
26.11.2011, 21:17 #14
Цитата Сообщение от Day Посмотреть сообщение
Эта константа у меня почти едиственная. Запомнить ее легко. Включаю только в главный файл проекта (там где main) И забываю о ней. Помещаю свои хедеры за системными. Свой #define ставлю перед своими хедерами. С моими макросами это в конфликт надеюсь не войдет. Я же сторож коду своему.
За 20 лет использования этой техники пришлось сопровождать несколько десятков проектов с пересекающимся множеством исходников - и ничего.
4) Я никому не навязываю своего подхода.
У вас единственная, а у других может быть не единственной. Очевидно, вы не принимали участие, я уж не говорю про крупные проекты, но даже в срединх по объему проектов, где заголовочных файлов бывает порядка 150, не считая стандартных.
0
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
26.11.2011, 22:42 #15
Цитата Сообщение от Сыроежка Посмотреть сообщение
У вас единственная, а у других может быть не единственной. Очевидно, вы не принимали участие, я уж не говорю про крупные проекты, но даже в срединх по объему проектов, где заголовочных файлов бывает порядка 150, не считая стандартных.
Уважаемый! Когда же вы научитесь вести себя прилично и не наскакивать на мало знакомых вам людей.
Я же не спрашиваю, в каких проектах участвовали вы, не подвергаю сомнению вашу квалификацию (во всяком случае на страницах этого форума), ни разу не высказал сомений в ваших умственных способностях.
Мое предложение, прекратить этот дурацкий спор, пока нам не надавали по нашим виртуальным задницам, хотя судя по всему, вам на это наплевать.
На этот пост можете не отвечать.
ЗЫ. Хотя если вам для душевного здоровья необходимо, чтобы последнее слово осталось за вами - пожалуйста!
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2011, 22:42
Привет! Вот еще темы с ответами:

Undefined reference to - C++
Есть класс NavyPort. Его заголовок: #ifndef NAVYPORT_H #define NAVYPORT_H class NavyPort { public: NavyPort(bool...

Undefined reference to - C++
Помогите, пожалуйста. Нужно было написать программу с использованием шаблона. Появляется ошибка &quot;undefined reference to...

Undefined reference to - C++
Matrix.h #pragma once #include &lt;iostream&gt; template &lt;typename T&gt; class Matrix { private: int n1, n2; T **mas; public:...

undefined reference to `A::a' - C++
//==========================================================================================================================================...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
26.11.2011, 22:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru