2011-08-12 7 views
1

私は、ウェブサーバを書いてみます。私の知る限り、Windowsでは静かに動作します。しかし、私はUnixと互換性があるようにしたい。そして、私は、例外クラスの遺伝に関する問題がなければならないと思います。より良い理解、ちょうど重要な部分については :GCC 4.5.2リンカGOTS問題の例外を使用している(C++)は

server.cpp

#include <exception> 
#include <stdexcept> 

#ifdef __unix__ 
    #include "UnixSocket.h" 
#elif __WIN32__ || _MSC_VER 
    #include "WinSocket.h" 
#endif 

#include "HTTPParser.h" 

int main(void) { 
    try { 
     socket->socketInit(PORT); 
    } 
    catch (exception &e) { 
     cout << endl << "Exception: " << e.what() << endl; 
     socket->cleanAll(); 
    } 
return 0 
} 

NetInterface.h

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() {}; 

};

UnixSocket.h

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() {}; 
}; 

HTTPParser.hあり

class HTTPParser : public exception { 
private: 
    [...] 

public: 
    HTTPParser(NetInterface *_socket, string _path); 
    void parsePacket(void); 

    virtual ~HTTPParser() throw() {}; 
}; 

あなたSEクラス宣言の短い要約することができます。 しかし、今gccが私にこのような何か伝えます:

/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 

、さらに....あなたはgccとリンクされているように見えるundefined reference to __gxx_personality_v0リンカメッセージから判断

+0

オブジェクトのリンクに使用したコマンドラインは何ですか? – Mark

+0

ライブラリをリンクするには、 '#'と '-lstdC++'を実行する必要があります。 – arunkumar

+1

'gcc'ではなく' g ++ 'でコンパイルしていますか? –

答えて

6

を。 C++アプリケーションとg++をリンクする必要があります。またはgccとリンクし、-lstdc++をリンカーコマンドラインに追加してください。

0

あなたは、関連するコードとコンパイラの呼び出しを示していないが、std::exceptionがあなたを上書きすると予想している実装されていない仮想メンバ関数what()を持っているので、あなたがwhat()を呼び出したい場合は裸std::exception Sを投げて行かないことを知っています。

<stdexcept>の派生した特定の例外のいずれかは、what()を実装し、例外オブジェクトを構築するときにメッセージを格納できるようにします。

+2

:-)おかげで__gxx_personality_v0'に '未定義の参照が存在するという事実は、cが++ランタイム意味でリンクされていない...私に-lstdC++ ...恥を逃した –

+0

@Maxim:それがありますいい視点ね。私は答えに少し追加しました。 –

関連する問題