help-gplusplus
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Undefined symbol : typeinfo for eckit::Exception


From: jerryleo
Subject: Undefined symbol : typeinfo for eckit::Exception
Date: Wed, 19 Oct 2016 03:55:11 -0700 (PDT)
User-agent: G2/1.0

Hi,

I'm stuck on a runtime error "undefined symbol: _ZTIN5eckit9ExceptionE" with a 
shared library libMagPlus.so.  There was no error while building it, the error 
just was raised at runtime when Python module loading it.

Symbol '_ZTIN5eckit9ExceptionE' was demangled into a readable symbol 'typeinfo 
for eckit::Exception'

Checked with nm, the undefined symbol '_ZTIN5eckit9ExceptionE' is from a static 
library libOdb.a, which was static linked into libMagPlus.so, like this


nm -Cl libOdb.a | grep -i "eckit::Exception"

<code>
                 U eckit::Exception::Exception(std::string const&, 
eckit::CodeLocation const&)  
/opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:84
                 U eckit::Exception::~Exception()       
/opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:108
0000000000000000 W eckit::Exception::retryOnClient() const      
/opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:48
0000000000000000 W eckit::Exception::retryOnServer() const      
/opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:47
0000000000000000 W eckit::Exception::terminateApplication() const       
/opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:49
0000000000000000 W eckit::Exception::what() const       
/opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:46
                 U eckit::Exception::print(std::ostream&) const
                 U typeinfo for eckit::Exception
</code>

I also tried to unpack all object files from libOdb.a and relink libMagPlus.so 
with all of them with option '-fvisibility=default -rdynamic', like this

<code>
ar x libOdb.a ( ./Odb ) 

/usr/bin/g++ -fvisibility=default -rdynamic -fPIC -pipe -O2 -g \
-Wl,--disable-new-dtags -shared \
-Wl,-soname,libMagPlus.so -o ../lib/libMagPlus.so \
... ...  \
./Odb/*.o  \
... ...

</code>

But still got these undefined symbols

<code>
U eckit::Exception::~Exception()       
/opt/src/OdbAPI-0.10.2-Source/eckit/src/eckit/exception/Exceptions.h:108
U eckit::Exception::print(std::ostream&) const
U typeinfo for eckit::Exception
<code>

Here are the the header that defines eckit::Exception class.

<code>
Exceptions.h

/// @brief General purpose exception
/// Derive other exceptions from this class and implement then in the class 
that throws them.
class Exception : public std::exception {

public: // methods

    /// Constructor with message
    Exception(const std::string& what, const CodeLocation& location = 
CodeLocation() );

    /// Destructor
    /// @throws nothing
    ~Exception() throw();

    virtual const char *what() const throw() {  return what_.c_str(); }
    virtual bool retryOnServer() const        { return false; }
    virtual bool retryOnClient() const        { return false; }
    virtual bool terminateApplication() const { return false; }

    static bool throwing();
    static void exceptionStack(std::ostream&,bool callStack = false);

    const std::string& callStack() const { return callStack_; }

protected: // methods

void reason(const std::string&);
Exception();

    virtual void print(std::ostream&) const;

private: // members

    std::string       what_;      ///< description
    std::string       callStack_; ///< call stack
    SavedStatus       save_;      ///< saved monitor status to recover after 
destruction
    Exception*        next_;
    CodeLocation      location_;  ///< where exception was first thrown

    friend std::ostream& operator<<(std::ostream& s,const Exception& p)
    {
        p.print(s);
        return s;
    }
}; 

</code>


I knew little about C++, and have no idea how to get this fixed. Wondering if 
needs to touch Exceptions.h and how to touch it ?

Anybody can help ?

Appreciating your time

Regards


reply via email to

[Prev in Thread] Current Thread [Next in Thread]