Название: Ошибка: multiple definition of Отправлено: gidrowolf от Июнь 14, 2011, 10:51 После долгого перерыва в программировании вроде как обычно создаю класс и получаю такие ошибки:
Код: debug/mainwindow.o: In function `Test': test.h: Цитировать #ifndef TEST_H #define TEST_H class Test { public: Test(); }; Test::Test() { } #endif // TEST_H В mainwindow.h добавлены только две строки: Цитировать #include "test.h" Остальное стандартный шаблон.Test test; В вложении сам проект. Название: Re: Ошибка: multiple definition of Отправлено: BRE от Июнь 14, 2011, 10:56 Код
Название: Re: Ошибка: multiple definition of Отправлено: gidrowolf от Июнь 14, 2011, 11:02 Код
А с чем это связано? Я что-то пропустил? Просто раньше оно и так компилилось. Я даже щас заглянул в книгу "Джесс Либерти" там без inline везде написано. Название: Re: Ошибка: multiple definition of Отправлено: BRE от Июнь 14, 2011, 11:06 Всегда нужно было писать, если реализацию методов пишешь в заголовочном файле.
Название: Re: Ошибка: multiple definition of Отправлено: gidrowolf от Июнь 14, 2011, 11:20 Всегда нужно было писать, если реализацию методов пишешь в заголовочном файле. Понятно, я этого не знал. Просто раньше все в самом классе писал, а щас решил вынести реализацию из класса и не мусорить.Название: Re: Ошибка: multiple definition of Отправлено: LisandreL от Июнь 14, 2011, 11:29 Просто раньше все в самом классе писал, а щас решил вынести реализацию из класса и не мусорить. Ну так в *.cpp б и выносили.А так сейчас вы место того, что бы не мусорить, переложили мусор из одного угла комнаты в другой. Название: Re: Ошибка: multiple definition of Отправлено: Fess от Июнь 14, 2011, 12:49 освежите в памяти как компилируются и линкуются программы на С++
компилятор обрабатывает только cpp файлы вы описали функцию в h файле и она попала в несколько разных cpp через #incude каждый cpp был отдельно откомпилирован в объектный файл, но линкер не смог их всех собрать, поскольку оказалось несколько функций с одной сигнатурой. Какую из них следует вызывать - непонятно. Если вы выносите тело функции в cpp файл, то в h у вас остается только объявление функции, и у линкера проблем не возникает, поскольку код этой функции существует в единственном числе в одном только объектном файле. вариант с inline тоже прокатывает, поскольку компилятор подставит код функции в место вызова и линкер вообще не будет знать, что таковая существует. Но нужно ли это вам - вопрос отдельный. |