crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Не собирается программа, multiple definition
Awesome
  опции профиля:
сообщение 26.1.2011, 22:07
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 26.1.2011
Пользователь №: 2370

Спасибо сказали: 0 раз(а)




Репутация:   0  


Написал свой класс, подключил к программе.
При попытке запустить в консоли сборки вылезают ошибки вида:
tmp/obj/debug_shared/имя_класса.o:C:\Qt\2010.05\qt\имя_проекта/../../include/QtCore/../../src/corelib/global/qglobal.h:1381: multiple definition of `имя_класса::имя_метода()'
Ошибок много, столько же, сколько у меня методов в классе, кроме тех, которые определены в объявлении (inline)
Ну и в конце ещё collect2: ld returned 1 exit status
Помогите пожалуйста, не могу разобраться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 26.1.2011, 22:10
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Ну так ты код приложи, что бы было с чем разбираться
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Awesome
  опции профиля:
сообщение 26.1.2011, 22:40
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 26.1.2011
Пользователь №: 2370

Спасибо сказали: 0 раз(а)




Репутация:   0  


Создаю в QtCreator проект GUI, создаю файл myclass.cpp:
class myClass {
private:
    int itsAbc;
    void setAbc();
public:
    myClass();
    ~myClass() { }
};

myClass::myClass() {
    setAbc();
}

void myClass::setAbc() {
    itsAbc = 666;
}


Пишу в mainwindow.cpp
#include "myclass.cpp"


Жму "Выполнить".
Полный текст консоли сборки:
Раскрывающийся текст
Выполняется сборка проекта nerabotaetclass...
Настройки не изменились, этап qmake пропускается.
Запускается "C:/Qt/2010.05/mingw/bin/mingw32-make.exe" -w

mingw32-make: Entering directory `C:/][/qt/nerabotaetclass-build-desktop'

C:/Qt/2010.05/mingw/bin/mingw32-make -f Makefile.Debug

mingw32-make[1]: Entering directory `C:/][/qt/nerabotaetclass-build-desktop'

g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows -o debug\nerabotaetclass.exe debug/main.o debug/mainwindow.o debug/myclass.o debug/moc_mainwindow.o -L"c:\Qt\2010.05\qt\lib" -lmingw32 -lqtmaind -lQtGuid4 -lQtCored4

mingw32-make[1]: Leaving directory `C:/][/qt/nerabotaetclass-build-desktop'

mingw32-make: Leaving directory `C:/][/qt/nerabotaetclass-build-desktop'

debug/myclass.o: In function `myClass':

C:\][\qt\nerabotaetclass-build-desktop/../nerabotaetclass/myclass.cpp:10: multiple definition of `myClass::myClass()'

debug/mainwindow.o:C:\][\qt\nerabotaetclass-build-desktop/../nerabotaetclass//myclass.cpp:10: first defined here

debug/myclass.o: In function `myClass':

C:\][\qt\nerabotaetclass-build-desktop/../nerabotaetclass/myclass.cpp:10: multiple definition of `myClass::myClass()'

debug/mainwindow.o:C:\][\qt\nerabotaetclass-build-desktop/../nerabotaetclass//myclass.cpp:10: first defined here

debug/myclass.o:C:\][\qt\nerabotaetclass-build-desktop/../nerabotaetclass/myclass.cpp:14: multiple definition of `myClass::setAbc()'

debug/mainwindow.o:C:\][\qt\nerabotaetclass-build-desktop/../nerabotaetclass//myclass.cpp:14: first defined here

collect2: ld returned 1 exit status

mingw32-make[1]: *** [debug\nerabotaetclass.exe] Error 1

mingw32-make: *** [debug] Error 2

Процесс "C:/Qt/2010.05/mingw/bin/mingw32-make.exe" завершился с кодом %2.
Возникла ошибка при сборке проекта nerabotaetclass (цель: Настольный компьютер)
Во время выполнения сборки на этапе "Сборка"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 26.1.2011, 23:17
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Awesome @ 26.1.2011, 22:40) *
#include "myclass.cpp"
Заголовочный файл (*.h) подключать через include надо, а не .cpp
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Awesome
  опции профиля:
сообщение 27.1.2011, 0:01
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 26.1.2011
Пользователь №: 2370

Спасибо сказали: 0 раз(а)




Репутация:   0  


хм. Мой класс не был разделен на файлы заголовка и файлы с методами, и то и другое было в файле myclass.cpp
Видимо так нельзя, потому что после разделения класса на .h и .cpp всё, вроде бы, работает.
Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
silver47
  опции профиля:
сообщение 27.1.2011, 7:36
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 356
Регистрация: 1.4.2010
Пользователь №: 1584

Спасибо сказали: 40 раз(а)




Репутация:   6  


multiple definition of

множественное объявление одного и того же. Не забываем про
#ifndef MYCLASS_H
#define MYCLASS_H
..
..
..
#endif // MYCLASS_H


А так да - лучше все таки делить на заголовочные и сорсные.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 27.1.2011, 21:04
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(igor_bogomolov @ 27.1.2011, 1:17) *
Видимо так нельзя
а ты за препроцессора, для понимания, сделай работу. Вместо строки
#include "myclass.cpp"
помести этот самый файл, всюду где в проекте эта строка применяется, и посмотри что получится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Awesome
  опции профиля:
сообщение 28.1.2011, 23:30
Сообщение #8


Новичок


Группа: Новичок
Сообщений: 7
Регистрация: 26.1.2011
Пользователь №: 2370

Спасибо сказали: 0 раз(а)




Репутация:   0  


Litkevich Yuriy, я вроде бы делал то, про что говорит silver47, да и инклуд у меня был всего один. Если только creator сам не добавил еще один куда-нибудь :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 29.1.2011, 10:10
Сообщение #9


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

Спасибо сказали: 101 раз(а)




Репутация:   9  


Файл назван *.cpp, поэтому он считается файлом исходных кодом. Из-за этого он компилируется два раза - один раз как файл myclass.cpp, второй - в составе mainwindow.cpp.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_FantasyOR_*_*
сообщение 26.3.2012, 16:55
Сообщение #10





Гости








    


Раскрывающийся текст

{
    QString str = ui->lineEditTest->text();
    //QString str = "строка на русском"; //если убрать этот коммент, то функция нормально переведет эту строку
    QString result = "";
    QHash<QChar,QString> trHash;
    trHash.insert('а',"a");    trHash.insert('б',"b");
    trHash.insert('в',"v");    trHash.insert('г',"g");
    trHash.insert('д',"d");    trHash.insert('е',"ye");
    trHash.insert('ё',"yo");    trHash.insert('ж',"zh");
    trHash.insert('з',"z");    trHash.insert('и',"i");
    trHash.insert('й',"y");    trHash.insert('к',"k");
    trHash.insert('л',"l");    trHash.insert('м',"m");
    trHash.insert('н',"n");    trHash.insert('о',"o");
    trHash.insert('п',"p");    trHash.insert('р',"r");
    trHash.insert('с',"s");    trHash.insert('т',"t");
    trHash.insert('у',"u");    trHash.insert('ф',"f");
    trHash.insert('х',"kh");    trHash.insert('ц',"c");
    trHash.insert('ч',"ch");    trHash.insert('ш',"sh");
    trHash.insert('щ',"sch");    trHash.insert('ъ',"");
    trHash.insert('ы',"y");    trHash.insert('ь',"");
    trHash.insert('э',"e");    trHash.insert('ю',"yu");
    trHash.insert('я',"ya");
    str = str.toLower();
    for(int i=0;i<str.size();i++) {
        qDebug() << str.at(i);
        if(trHash.contains(str.at(i)) == true){
            result.append(trHash.value(str.at(i)));
        }
        else result.append(str.at(i));
    }
    ui->lineEditTest->setText(result);
}





Не сочтите за некрофилию
Стиль программирования if(trHash.contains(str.at(i)) == true) в Вашем коде выше (взят был из http://www.forum.crossplatform.ru/lofivers....php/t3712.html ) недопустим. Вы в булевом условии сравниваете ответ с истиной?!?!?!?!

надеюсь за год , Вы исправили эту свою привычку.
посмотрите внимательно что получается:
если ( (правда == правда)=правда )...
если ( (ложь == правда)=ложь )...

у Вас ответ и так правда или ложь, зачем её сравнивать ещё раз?
должно быть:
if ( trHash.contains(str.at(i)) ) ... contains - возвращает bool.

bool - это синтетический тип на самом деле это int
0 = false
<0> = true - любое не нулевое значение, как положительное, так и отрицательное даст true

if (1)... - true пойдёт в ветвь then
if (-1)... - true пойдёт в ветвь then
if (-909090)... - true пойдёт в ветвь then
if (0)... - false пойдёт в ветвь else


таким образом можно делать что-то вроде:
if ( массив.size() )..., но конечно не стоит у массива(не только QVector, но и QList, и QStringList...) есть isEmpty()

Ещё раз прошу прощения. Надеюсь за год Вы уже исправились. Просто это был шок и решил подсказать Вам как правильно.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 23:44