title: GCC 4.5.2 Linker gots Problem while using Exceptions (C++)
body: <p>I try to write a webserver. As far as I am, it works quiet good with Windows. But I want to make it also Unix compatible. And I think there has to be a problem with the heredity f the exception class.
  For better understanding, just the important parts:</p>
  
  <p>server.cpp</p>
  
  <pre><code>#include &lt;exception&gt;
  #include &lt;stdexcept&gt;
  
  #ifdef __unix__
      #include "UnixSocket.h"
  #elif __WIN32__ || _MSC_VER
      #include "WinSocket.h"
  #endif
  
  #include "HTTPParser.h"
  
  int main(void) {
      try {
          socket-&gt;socketInit(PORT);
      }
      catch (exception &amp;e) {
          cout &lt;&lt; endl &lt;&lt; "Exception: " &lt;&lt; e.what() &lt;&lt; endl;
          socket-&gt;cleanAll();
      }
  return 0
  }
  </code></pre>
  
  <p>NetInterface.h</p>
  
  <pre><code>class NetInterface : public exception {
  
  private:
  
  public:
      virtual void socketInit(const char *port) = 0;
      virtual void cleanAll(void) = 0;
      virtual void cleanPersCon(void) = 0;
      virtual char *akzeptieren(void) = 0;
      virtual void empfangen(void) = 0;
      virtual void senden(void) = 0;
      virtual void *get_in_addr(struct sockaddr *sa) = 0;
      virtual string getIncoming(void) = 0;
      virtual void setOutcoming(string s) = 0;
  
      virtual ~NetInterface() throw() {};
  </code></pre>
  
  <p>};</p>
  
  <p>UnixSocket.h</p>
  
  <pre><code>class UnixSocket : virtual public NetInterface { 
  private: 
      [...]
  public:
      UnixSocket(void);
  //kill socket connections
      void cleanAll(void);
      void cleanPersCon(void);
  //SysCalls
      void socketInit(const char *port);
      char *akzeptieren(void);
      void empfangen(void);
      void senden(void);
  //Getter and Setter
      string getIncoming(void);
      void setOutcoming(string s);
  
      virtual ~UnixSocket() throw() {};
  };
  </code></pre>
  
  <p>HTTPParser.h</p>
  
  <pre><code>class HTTPParser : public exception {
  private:
      [...]
  
  public:
      HTTPParser(NetInterface *_socket, string _path);
      void parsePacket(void);
  
      virtual ~HTTPParser() throw() {};
  };
  </code></pre>
  
  <p>There you can se a short summary of the class declarations.
  But now the gcc tells me something like this:</p>
  
  <pre><code>/tmp/cc8DNmKI.o:(.rodata._ZTV10HTTPParser[vtable for HTTPParser]+0x10): undefined reference to `std::exception::what() const'
  /tmp/cc8DNmKI.o:(.rodata._ZTV10UnixSocket[vtable for UnixSocket]+0x14): undefined reference to `std::exception::what() const'
  /tmp/cc8DNmKI.o:(.rodata._ZTV10UnixSocket[vtable for UnixSocket]+0x78): undefined reference to `std::exception::what() const'
  /tmp/cc8DNmKI.o:(.rodata._ZTV12NetInterface[vtable for NetInterface]+0x10): undefined reference to `std::exception::what() const'
  /tmp/cc8DNmKI.o:(.rodata._ZTV12NetInterface[vtable for NetInterface]+0x14): undefined reference to `__cxa_pure_virtual'
  /tmp/cc8DNmKI.o:(.rodata._ZTV12NetInterface[vtable for NetInterface]+0x18): undefined reference to `__cxa_pure_virtual'
  /tmp/cc8DNmKI.o:(.rodata._ZTV12NetInterface[vtable for NetInterface]+0x1c): undefined reference to `__cxa_pure_virtual'
  /tmp/cc8DNmKI.o:(.rodata._ZTV12NetInterface[vtable for NetInterface]+0x20): undefined reference to `__cxa_pure_virtual'
  /tmp/cc8DNmKI.o:(.rodata._ZTV12NetInterface[vtable for NetInterface]+0x24): undefined reference to `__cxa_pure_virtual'
  /tmp/cc8DNmKI.o:(.rodata._ZTV12NetInterface[vtable for NetInterface]+0x28): more undefined references to `__cxa_pure_virtual' follow
  /tmp/cc8DNmKI.o:(.rodata._ZTVSt16invalid_argument[vtable for std::invalid_argument]+0x10): undefined reference to `std::logic_error::what() const'
  /tmp/cc8DNmKI.o:(.rodata._ZTVSt12domain_error[vtable for std::domain_error]+0x10): undefined reference to `std::logic_error::what() const'
  /tmp/cc8DNmKI.o:(.rodata._ZTI10HTTPParser[typeinfo for HTTPParser]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
  /tmp/cc8DNmKI.o:(.rodata._ZTI10HTTPParser[typeinfo for HTTPParser]+0x8): undefined reference to `typeinfo for std::exception'
  /tmp/cc8DNmKI.o:(.rodata._ZTI10UnixSocket[typeinfo for UnixSocket]+0x0): undefined reference to `vtable for __cxxabiv1::__vmi_class_type_info'
  /tmp/cc8DNmKI.o:(.rodata._ZTI10UnixSocket[typeinfo for UnixSocket]+0x18): undefined reference to `typeinfo for std::exception'
  /tmp/cc8DNmKI.o:(.rodata._ZTI12NetInterface[typeinfo for NetInterface]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
  /tmp/cc8DNmKI.o:(.rodata._ZTI12NetInterface[typeinfo for NetInterface]+0x8): undefined reference to `typeinfo for std::exception'
  /tmp/cc8DNmKI.o:(.rodata._ZTISt16invalid_argument[typeinfo for std::invalid_argument]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
  /tmp/cc8DNmKI.o:(.rodata._ZTISt16invalid_argument[typeinfo for std::invalid_argument]+0x8): undefined reference to `typeinfo for std::logic_error'
  /tmp/cc8DNmKI.o:(.rodata._ZTISt12domain_error[typeinfo for std::domain_error]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
  /tmp/cc8DNmKI.o:(.rodata._ZTISt12domain_error[typeinfo for std::domain_error]+0x8): undefined reference to `typeinfo for std::logic_error'
  /tmp/cc8DNmKI.o:(.eh_frame+0xeb): undefined reference to `__gxx_personality_v0'
  collect2: ld returned 1 exit status
  </code></pre>
  
  <p>and even more....</p>