Even when you make a destructor a pure virtual function, you still need to provide a definition for that destructor.
Pure virtual functions cannot be called through the mechanism of a virtual (dynamic) call, but this does not in any way prohibit calling the same functions through the mechanism of an ordinary direct non-virtual (static) call. Therefore, if you have non-virtual calls of a certain pure virtual function in the program, then you will have to provide a definition for this function.
A destructor is just an example of a function that, in general, will be implicitly called in a non-virtual way too. In particular, the base class destructor will be implicitly called from the destructors of the heir classes, if any. In your case, the error just arises as soon as the heir classes appear in the program. Therefore, a definition should always be provided for the destructor.
It is also worth noting that in C ++ the definitions of pure virtual functions should be made outside the class definition , i.e. the grammar of the language does not allow "thrust" into the declaration of the function at the same time and the pure specifier = 0 and the body of the function. The definition should be done separately.