9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
|||||||||||
1 | |||||||||||
undefined reference to `variable`26.11.2011, 18:49. Показов 3768. Ответов 18
Метки нет (Все метки)
Вобщем то есть заголовочный файл main.h
Код
obj\Release\WndProc.o:WndProc.cpp undefined reference to `ip' obj\Release\WndProc.o:WndProc.cpp undefined reference to `Port' //и так по всем переменым
0
|
26.11.2011, 18:49 | |
Ответы с готовыми решениями:
18
Странная ошибка: [Linker error] undefined reference to `__dyn_tls_init_callback' [Linker error] undefined reference to ld returned 1 exit status Problem with passing a list variable by a reference Undefined reference to undefined reference |
Заблокирован
|
||||||
26.11.2011, 18:58 | 3 | |||||
OrmaJever,
Потому что вы нигде не определили эти переменные. Компилятор видет их объявление, но не знает их определения. Добавлено через 2 минуты Ничего подобного! Можно во всех модулях объявить переменную с extern. Гланое - это определить ее в каком-нибудь модуле, например,
0
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
|
26.11.2011, 18:59 [ТС] | 4 |
Байт, извините я не понял. Если в main.h обьявлять без extern топотом в многих местах ругается на многократное определение.
0
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
||||||
26.11.2011, 19:02 [ТС] | 6 | |||||
но они определяются только в main.cpp
0
|
Заблокирован
|
|
26.11.2011, 19:09 | 7 |
Что вы тащите кишку кода?! Как следует из вашего первоначального сообщения, вы объявления этих переменных поместили в заголовочный файл. И у вас теперь, как я понимаю, по крайней мере две единицы трансляции видят эти объявления, так? Ну тогда редактор связей не знает, в какой единице трансляции имеется определение этих переменных. Где определение этих переменных, а где их только использование без определения. Разницу между объявлением объекта и определением объекта понимаете?
0
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
||||||||||||||||
26.11.2011, 19:21 [ТС] | 9 | |||||||||||||||
Ну так, WndProc.cpp компилируется отдельно, main.cpp отдельно.
Ну вот я и пытаюсь обьявить, но как сказать что используемая переменая в WndProc.cpp отпределяется в main.cpp? Можно сказать уже понимаю, но ещё бы разок послушал разницу. Добавлено через 4 минуты Опишу ситуацию вот так main.h
0
|
Заблокирован
|
||||||||||||||||||||||||||||||||||||
26.11.2011, 19:34 | 10 | |||||||||||||||||||||||||||||||||||
Я вам сейчас подробно все объясню. Дело в том, когда в списке спецификаций стоит слово extern для объекта, но сам объект не инициализируется, то это является объявлением объекта, но не его определением. Ежеди присутствует выражение инициализации, то тогда это является опредеением.
Для примера
Естественно компилятор не знает, а гед же эта переменная определена, в каком модуле. Давайте рассмотрим другой пример. Во все модули вы включили в глобальное пространство имен предложение
Как тогда поступить? Вы в заголовочном файле оставляете свое объявление
1
|
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
|
|||||||||||
26.11.2011, 20:14 | 11 | ||||||||||
OrmaJever, я делаю так.
В Хедере пишу
2
|
Заблокирован
|
|
26.11.2011, 20:55 | 12 |
Day,
Проблема в том, что это усложняет код, так как теперь 1) надо помнить, какие манифестные константы надо объявлять перед включением того или иного заголовочного файла; 2) может быть коллизия заголовочных файлов, у которых определен такой же макрос, а потому поведение кода будет непредсказуемым; 3) это усложняет сопровождение кода.
0
|
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
|
|
26.11.2011, 21:13 | 13 |
Эта константа у меня почти едиственная. Запомнить ее легко. Включаю только в главный файл проекта (там где main) И забываю о ней.
4) Я никому не навязываю своего подхода.
2
|
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
|
|
26.11.2011, 22:42 | 15 |
Уважаемый! Когда же вы научитесь вести себя прилично и не наскакивать на мало знакомых вам людей.
Я же не спрашиваю, в каких проектах участвовали вы, не подвергаю сомнению вашу квалификацию (во всяком случае на страницах этого форума), ни разу не высказал сомений в ваших умственных способностях. Мое предложение, прекратить этот дурацкий спор, пока нам не надавали по нашим виртуальным задницам, хотя судя по всему, вам на это наплевать. На этот пост можете не отвечать. ЗЫ. Хотя если вам для душевного здоровья необходимо, чтобы последнее слово осталось за вами - пожалуйста!
1
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
||||||||||||||||
26.11.2011, 23:47 [ТС] | 16 | |||||||||||||||
Но зачем я тогда обьявляю их в main.h?
Добавлено через 25 минут Day, спасибо, вроде бы работает. Добавлено через 28 минут Так, а что делать с константами? Их нельзя обьявить extern. Схема такая же. main.h
0
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
||||||
27.11.2011, 00:31 [ТС] | 18 | |||||
Байт, И правда простейшее рядом!
Вот только у меня вопрос, если есть строка "string" она же не очищается из памяти? Я просто не знаю как передавать параметры функции
0
|
Заблокирован
|
||||||
27.11.2011, 06:57 | 19 | |||||
Когда же вы поймете, что надо за советом обращаться не к дилетантам, а к профессионалам?! Что же вы постоянно наступаете на одни и те же грабли?!
Разъясняю подробно. Константные объекты имеют внутреннее связывание.. Что это означает? Что вы в заголовочном файле можете объявить константный объект и включить этот заголовочный файл во все модули. Это будут разные объекты!, то есть они не ивступят в конфликт с друг другом, так как редактор связей их не будет видеть! Это только если вы объявите константный объект со спецификатором extern, только тогдат редактор связей увидет константу. Кроме того, вы объявляете указатель на строковый литерал. Корректно его будет объявить как
Я не вижу у вас проблем с передачей этого указателя в функции. У вас есть прототип функции, который должен, как я понимаю, принимать параметр, который является константным указателем ( то есть указателем на константный объект). Какие проблемы?! Добавлено через 4 минуты Вы можете конечно демонстрировать свое возмущение, бить себя в грудь, что вы, якобы, участвовали в крупных проетах, но я вам скажу прямо: в крупных проектах такую самодеятельность с макроопределениями зарубают на корню! Проблема в том, что вы даже не поняли, когда я говорил о коллизии заголовочных файлов! Это тот случай, когда потом ощибку в программе будет очень трудно находить! Профессионалы таких вещей не допускают. Это только любители могут 20 лет использовать такие объявления, так как в рамках их небольших проектов это вполне допустимо. Извините, но я , как профессионал, обязан дать оценку тому, что вы предлагаете, не зависимо от того, нравится вам это или нет.
0
|
27.11.2011, 06:57 | |
27.11.2011, 06:57 | |
Помогаю со студенческими работами здесь
19
Undefined reference to Undefined reference Undefined reference to undefined reference Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |