![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
denis_panchenko |
![]() ![]()
Сообщение
#1
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 28.8.2011 Пользователь №: 2834 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Объясню суть проблемы на примере.
Имеется 3 файла: 1) a.h
2) b.h
3) c.h
При таком положении дел все компилируется и работает, но стоит добавить файл b.cpp
как линкер выдаёт ошибку: a.h:6: multiple definition of `ns::foo()'. Не понимаю чем вызвана эта ошибка и как в данном случае с ней справиться? Задаю вопрос в разделе про Qt, так как это упрощенная модель структуры программы, которая создаётся в Qt Creator 4.6.2 Сообщение отредактировал ViGOur - 1.11.2011, 20:03
Причина редактирования: Добавил тэги CODE
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Задаю вопрос в разделе про Qt, так как это упрощенная модель структуры программы, которая создаётся в Qt Creator 4.6.2 это не повод. Ошибка линкера не связана с Qt.ак линкер выдаёт ошибку: a.h:6: multiple definition of `ns::foo()'. линкер пишет ещё одну строку, в которой указывает, где в первые встречается объявление.
|
|
|
denis_panchenko |
![]()
Сообщение
#3
|
Новичок Группа: Новичок Сообщений: 2 Регистрация: 28.8.2011 Пользователь №: 2834 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Qt Creator выдает следующие три сообщения:
a.h:3: multiple definition of `foo()' a.h:3: first defined here error: collect2: ld returned 1 exit status Никак не могу понять, почему он говорит, о двойном объявлении функции... |
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Хех, что-то я сразу не заметил. У тебя в заголовочнике описана, а не просто объявлена функция, она попадает в файл b.cpp и куда-то ещё (в cpp-файл).
чтобы понять, нарисуй на бумаге какой файл в какой включается и так для каждого cpp-файла. |
|
|
Гость_Гость_* |
![]()
Сообщение
#5
|
Гости ![]() |
Проверьте файл проекта *.pro там файлы могут дублироваться
|
|
|
ssoft |
![]()
Сообщение
#6
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: ![]() ![]() ![]() |
Объясню суть проблемы на примере. Имеется 3 файла: 1) a.h //---------------------- #ifndef a_h #define a_h namespace ns { void foo(){}; } #endif //--------------------- 2) b.h //--------------------- #ifndef b_h #define b_h #include "a.h" #endif //--------------------- 3) c.h //--------------------- #ifndef c_h #define c_h #include "b.h" #endif При таком положении дел все компилируется и работает, но стоит добавить файл b.cpp //---------------------- #include "b.h" //---------------------- как линкер выдаёт ошибку: a.h:6: multiple definition of `ns::foo()'. Не понимаю чем вызвана эта ошибка и как в данном случае с ней справиться? Задаю вопрос в разделе про Qt, так как это упрощенная модель структуры программы, которая создаётся в Qt Creator 4.6.2 Все правильно, т.к. здесь представлена реализация не inline метода в заголовочном файле. Так должно работать
|
|
|
Алексей1153 |
![]()
Сообщение
#7
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2944 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
попробуй так
в заголовке:
в реализации
|
|
|
ssoft |
![]()
Сообщение
#8
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: ![]() ![]() ![]() |
Так тоже будет работать )))
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 16.7.2025, 12:22 |