Множественное обьявление

99
10 августа 2021, 05:30

Вот, что выдает компилятор, все функции и переменные объявлены один раз.

Проект относительно большой, исходники каких именно файлов приложить?

из-за чего именно происходит это? Сижу уже 5й час, пойду попью чаю.. буду через 15 мин, так , что не серчайте, если не сразу дополню.

obj\Debug\main.o: In function Z8inccordsiiP5cords': C:/c++/programs/FMV5/gGlobal.h:34: multiple definition ofinccords(int, int, cords*)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/gGlobal.h:34: first defined here obj\Debug\main.o: In function ZN5Logys4openEPKc': C:/c++/programs/FMV5/Logs/cLog.h:36: multiple definition ofLogys::open(char const*)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/Logs/cLog.h:36: first defined here obj\Debug\main.o: In function ZN5Logys4readB5cxx11Ei': C:/c++/programs/FMV5/Logs/cLog.h:41: multiple definition ofLogys::readabi:cxx11' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/Logs/cLog.h:41: first defined here obj\Debug\main.o: In function ZN5Logys5writeEPKc': C:/c++/programs/FMV5/Logs/cLog.h:57: multiple definition ofLogys::write(char const*)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/Logs/cLog.h:57: first defined here obj\Debug\main.o: In function ZN5Logys5clearEv': C:/c++/programs/FMV5/Logs/cLog.h:69: multiple definition ofLogys::clear()' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/Logs/cLog.h:69: first defined here obj\Debug\main.o: In function ZN5Logys4sizeEv': C:/c++/programs/FMV5/Logs/cLog.h:80: multiple definition ofLogys::size()' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/Logs/cLog.h:80: first defined here obj\Debug\main.o: In function ZN5Click4bornEPiS0_': C:/c++/programs/FMV5/cMenu.h:39: multiple definition ofClick::born(int*, int*)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu.h:39: first defined here obj\Debug\main.o: In function ZN4MenuC2Ev': C:/c++/programs/FMV5/cMenu.h:102: multiple definition ofMenu::Menu()' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu.h:102: first defined here obj\Debug\main.o: In function ZN4MenuC2Ev': C:/c++/programs/FMV5/cMenu.h:102: multiple definition ofMenu::Menu()' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu.h:102: first defined here obj\Debug\main.o: In function ZN4Menu5setupEiP10SDL_WindowP12SDL_RendererP5ModelP12Menu_Handler': C:/c++/programs/FMV5/cMenu.h:111: multiple definition ofMenu::setup(int, SDL_Window*, SDL_Renderer*, Model*, Menu_Handler*)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu.h:111: first defined here obj\Debug\main.o: In function ZN4Menu10add_buttonEiiiii': C:/c++/programs/FMV5/cMenu.h:120: multiple definition ofMenu::add_button(int, int, int, int, int)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu.h:120: first defined here obj\Debug\main.o: In function ZN4Menu3runEb': C:/c++/programs/FMV5/cMenu.h:129: multiple definition ofMenu::run(bool)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu.h:129: first defined here obj\Debug\main.o: In function ZN4Menu6inputsEv': C:/c++/programs/FMV5/cMenu.h:140: multiple definition ofMenu::inputs()' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu.h:140: first defined here obj\Debug\main.o: In function ZN4Menu7outputsEv': C:/c++/programs/FMV5/cMenu.h:161: multiple definition ofMenu::outputs()' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu.h:161: first defined here obj\Debug\main.o: In function ZN4Menu14connect_outputE6output': C:/c++/programs/FMV5/cMenu.h:179: multiple definition ofMenu::connect_output(output)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu.h:179: first defined here obj\Debug\main.o: In function ZN4Menu13connect_inputE5input': C:/c++/programs/FMV5/cMenu.h:180: multiple definition ofMenu::connect_input(input)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu.h:180: first defined here obj\Debug\main.o: In function ZN12Menu_Handler5setupEP12SDL_RendererP10SDL_WindowP5Model': C:/c++/programs/FMV5/cMenu_Handler.h:40: multiple definition ofMenu_Handler::setup(SDL_Renderer*, SDL_Window*, Model*)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu_Handler.h:40: first defined here obj\Debug\main.o: In function ZN12Menu_Handler9seek_menuEi': C:/c++/programs/FMV5/cMenu_Handler.h:45: multiple definition ofMenu_Handler::seek_menu(int)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu_Handler.h:45: first defined here obj\Debug\main.o: In function ZN12Menu_Handler10check_runsEv': C:/c++/programs/FMV5/cMenu_Handler.h:57: multiple definition ofMenu_Handler::check_runs()' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu_Handler.h:57: first defined here obj\Debug\main.o: In function Z15global_redirectP12Menu_HandleriiP5Model': C:/c++/programs/FMV5/cMenu_Handler.h:69: multiple definition ofglobal_redirect(Menu_Handler*, int, int, Model*)' obj\Debug\input\cppButton.o:C:/c++/programs/FMV5/cMenu_Handler.h:69: first defined here obj\Debug\main.o: In function ZSt19__iterator_categoryIPcENSt15iterator_traitsIT_E17iterator_categoryERKS2_': C:/c++/codeblocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/mingw32/bits/gthr-default.h:302: multiple definition ofrenderer' obj\Debug\input\cppButton.o:C:/c++/codeblocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/mingw32/bits/gthr-default.h:302: first defined here obj\Debug\main.o: In function ZSt19__iterator_categoryIPcENSt15iterator_traitsIT_E17iterator_categoryERKS2_': C:/c++/codeblocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/mingw32/bits/gthr-default.h:303: multiple definition ofwindow' obj\Debug\input\cppButton.o:C:/c++/codeblocks/MinGW/lib/gcc/mingw32/5.1.0/include/c++/mingw32/bits/gthr-default.h:303: first defined here collect2.exe: error: ld returned 1 exit status

Answer 1

Вы определили ваши функции в хедерах.

Даже если у вас стоят include guard или pragma once, это врятли решит проблему. Дело в том, что у вас есть несколько единиц трансляции, и каждая функция, определённая в хедере, оказывается в каждой единице трансляции, где был сделан соответствующий include (это очень примитивное объяснение, но я просто не хочу слишком детально на нём останавливаться).

Решить проблему можно тремя способами.

  1. Перенести все определения функция в cpp-файлы. Это самый правильный способ, не подойдёт, если ваши функции шаблонные (но для шаблонных у вас не должно было возникнуть описанной в вопросе ошибки).
  2. Добавить всем функциям спецификатор inline, например:

    inline void add_button(int, int, int, int, int) {/*...*/}
    

    Это поможет, но лучше так не делать.

  3. Сделать все функции шаблонными (но это уже совсем плохо, делать шаблоном только ради того, чтобы определить в хедере, крайне не рекомендую так поступать).

Суммируя всё вышесказанное, самое правильное решение - перенести все реализации в cpp-файл (1й способ). Если нужно очень быстро поэкспериментировать - можно воспользоваться вторым методом (но потом всё равно перенести реализации).

READ ALSO
Какая разница между a.b и a->b?

Какая разница между a.b и a->b?

У меня есть код, с двумя вариантами, первый который работает с оператором afirst и второй который работает с оператором a->first для меня разницы...

253
Конфликт обьявлений mySQL connector + C++

Конфликт обьявлений mySQL connector + C++

Пытаюсь использовать коннектер MySQL и C++ среда : Windows 10 Code::Blocks 1712 MySQL 8

346
Как отключить родной datepicker в firefox?

Как отключить родной datepicker в firefox?

Использую datepicker от JqueryВ браузере firefox При нажатии на <input type="date"> отражается сразу два datepicker:

132