Как правильно определить и связать деструктор класса C ++ с основным файлом? - PullRequest
1 голос
/ 24 января 2020

Это специализированный вопрос из mingw32 / bin / ld.exe ... неопределенная ссылка на [class] ... collect2.exe: ошибка: ld вернул 1 состояние выхода

Внутри MyClass.hpp существует пользовательский класс:

class MyClass
{
    public:
        MyClass(const string& className); 

        ~MyClass() {cout << "Destructor definition instead of g++ default one?";} ; 
        ...

, и вы пытаетесь создать из него объект в основном файле:

#include "MyClass.hpp" //in the same directory
...
int main()
{
...
MyClass myClassObj = MyClass(myName); //here is the linker problem
...
return 0;
}

Ошибка:

c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: C:\Users\....:Main.cpp:(.text+0x124c): undefined reference to `MyClass::~MyClass()'
collect2.exe: error: ld returned 1 exit status

Есть два вопроса: 1. Как я могу собрать Makefile или какую команду g ++ я могу использовать, чтобы правильно связать MyClass с Main? 2. Как g ++ может использовать этот собственный деструктор по умолчанию (в этом случае я его вообще не определял, до сих пор не работает). Или, если мне нужно определить его самому, как лучше всего это сделать?

простая команда компиляции:

g++ -o MyProgram.exe Main.cpp -Wall

Я также пробовал Makefile из: mingw32 / bin / ld.exe ... неопределенная ссылка на [class] ... collect2.exe: ошибка: ld вернул 1 состояние выхода

И я проверил зависимости цепочки инструментов следующим образом: Makefile : Как правильно включить заголовочный файл и его каталог?

Ответы [ 2 ]

1 голос
/ 25 января 2020

У меня была такая же проблема, как и у вас. Попробуйте переместить определение вашего конструктора и деструктора из cpp в заголовочный файл. Таким образом, связывание хорошо выполняется только при выполнении упомянутой вами простой команды g ++.

Попробуйте:

MyClass(const string& className){ _className=className }; 

Если определение находится внутри файла cpp, я получаю та же ошибка, что и у вас.

0 голосов
/ 24 января 2020

У вас есть MyClass определение конструктора и деструктора (как указано) в вашем заголовочном файле? Вы используете Makefile или только пытаетесь выполнить g ++ через терминал? Линкеру нужен скомпилированный объект MyClass. Если вы компилируете main. cpp во весь исполняемый файл, он должен содержать все объявленные определения.

...