Ошибка компилятора collect2: Id возвратил 1 статус выхода с использованием классов с QObject (QT 4.7 с Qt Creator)

В моем текущем проекте возникла следующая ситуация: «collect2: Id вернул 1 статус выхода», возвращаемый компилятором с использованием следующего кода:

#ifndef BASE_02_H
#define BASE_02_H

#include <QtCore>

class Base_02
{

public:
    Base_02();

    virtual void method()=0;
};

#endif // BASE_02_H

#include "base_02.h"
#include <QtCore>

Base_02::Base_02()
{

}

//----------------------------------------------------------------------------------------------------------------------------------

#ifndef DERIVED_02_H
#define DERIVED_02_H

#include <QtCore>
#include "base_02.h"

class Derived_02 : public Base_02
{

public:
    Derived_02();
    void method();
};

#endif // DERIVED_02_H

#include "derived_02.h"
#include <QtCore>

Derived_02::Derived_02()
{

}

void Derived_02::method()
{
    qDebug() << "Derived_02::method()";
}

//----------------------------------------------------------------------------------------------------------------------------------

#ifndef BASE_H
#define BASE_H

#include <QtCore>

class Base : public QObject
{
    Q_OBJECT

public:
    Base(Base* p=NULL);

    virtual void method()=0;
};

#endif // BASE_H

#include "base.h"
#include <QtCore>

Base::Base(Base* p)
{

}

//----------------------------------------------------------------------------------------------------------------------------------

#ifndef DERIVED_H
#define DERIVED_H

#include <QtCore>
#include "base.h"

class Derived : public Base
{
    Q_OBJECT

public:
    Derived(Derived* p=NULL);
    void method();
};

#endif // DERIVED_H

#include "derived.h"
#include "derived_02.h"
#include <QtCore>

Derived::Derived(Derived* p)
{

}

void Derived::method()
{
    Derived_02 d;
    d.method();
}

//----------------------------------------------------------------------------------------------------------------------------------

#include <QtCore/QCoreApplication>
#include <QtCore>
#include "base.h"
#include "derived.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);



    Derived* derived = new Derived();



    return a.exec();
}

Компилятор говорит следующее:

... mingw32-make: Вход в каталог C:/Entwicklung SVN/debug test/dataSenderReceiverExample' C:/Qt/2010.04/mingw/bin/mingw32-make -f Makefile.Debug mingw32-make[1]: Entering directoryC: / Entwicklung SVN / debug test / dataSenderReceiverExample 'g ++ -c -g -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL_PROADILE_CUPPORT -DQT_DLL_DARTTHADI_CODI .. \ Qt \ 2010.04 \ qt \ include \ QtCore "-I" ...... \ Qt \ 2010.04 \ qt \ include "-I" .. \ dataSenderReceiver "-I" ...... \ Qt \ 2010.04 \ qt \ include \ ActiveQt "-I" debug "-I" ...... \ Qt \ 2010.04 \ qt \ mkspecs \ win32-g ++ "-o debug \ main.o main.cpp main.cpp: В функции 'int main (int, char **)': main.cpp: 14: предупреждение: неиспользуемая переменная 'производная' g ++ -enable-stdcall-fixup -Wl, -enable-auto-import -Wl, -enable-runtime -pseudo-reloc -Wl, -subsystem, console -mthreads -Wl -o debug \ dataSenderReceiverExample.exe debug / main.o -L "c: \ Qt \ 2010.04 \ qt \ lib" -L ../ dataSenderReceiver / debug - ldataSenderReceiver -lQtCored4 mingw32-make [1]: Выход из каталога C:/Entwicklung SVN/debug test/dataSenderReceiverExample' mingw32-make: Leaving directoryC: / Entwicklung SVN / debug test / dataSenderReceiverExample '../dataSenderReceiver/debug/libdataSenderReceiver.a(dehibited.o):C:\Entwuglung testng dataSenderReceiver / производный.cpp: 14: неопределенная ссылка на Derived_02::Derived_02()' ../dataSenderReceiver/debug/libdataSenderReceiver.a(derived.o):C:\Entwicklung SVN\debug test\dataSenderReceiver/derived.cpp:15: undefined reference toDerived_02 :: method () 'collect2: ld вернула 1 статус выхода mingw32-make [1]: * [debug \ dataSenderReceiverExample.exe] Ошибка 1 mingw32-make: * [отладка] Ошибка 2 Prozess "C: /Qt/2010.04/mingw/bin/mingw32-make.exe" был обнаружен с дем Rückgabewert% 2. Fehler beim Erstellen des Projekts dataSenderReceiverExample (Ziel: Desktop) Beim Ausführen des Build-Schritts 'Make'

Пожалуйста помоги!


person 70sCommander    schedule 04.02.2011    source источник
comment
Похоже, производные .cpp и производные_02.cpp не загружаются. Вы используете QtCreator или запускаете его из командной строки? Какой у вас make-файл?   -  person thorsten müller    schedule 04.02.2011


Ответы (3)


#include "base_02.h"
#include <QtCore>

должно быть:

#include <QtCore>
#include "base_02.h"

Затем он компилируется!

person 70sCommander    schedule 04.02.2011

У меня возникла эта проблема в следующей ситуации:


Сказать

A - исполняемый (например, консольный) проект, а B и C - проекты библиотеки (например, статическая библиотека), а A использует B, а B использует C.

потом

A должен знать библиотеку B и библиотеку C через файл .pro, а B должен знать библиотеку C через файл .pro.


Сказать

в файле A .pro библиотека C обозначается перед библиотекой B:

LIBS *= -L"../C/debug"
LIBS *= -lC
INCLUDEPATH *= "../C"

LIBS *= -L"../B/debug"
LIBS *= -lB
INCLUDEPATH *= "../B"

потом

в точности описанная выше ошибка.


Решение:

Назовите библиотеку B перед библиотекой C в файле A .pro:

LIBS *= -L"../B/debug"
LIBS *= -lB
INCLUDEPATH *= "../B"

LIBS *= -L"../C/debug"
LIBS *= -lC
INCLUDEPATH *= "../C"
person MathMatX    schedule 04.02.2011

person    schedule
comment
Объясните, почему это ответ на вопрос. - person Jeroen Heier; 28.04.2019