|
From: | Sebastien Mamessier |
Subject: | Re: [certi-dev] Building CERTI on Ubuntu 15.10 (64bit) |
Date: | Mon, 11 Apr 2016 11:04:37 -0400 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.0 |
It looks like RTIfedTime.cc defines methods whose declaration
include `throw` of RTI::Exception types. Therefore, linker is
looking for the typeinfo (as I read in https://gcc.gnu.org/wiki/Visibility)
and doesn't find it as the RTI-> FedTime dependency is not
explicitely made in the CMake file (I understood this was made on
purpose to avoid a circular dependency). As explained here (https://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html), in GCC, the typeinfo object (for polymorphic classes) is written in the translation unit of the definition of the first non-inline virtual method. (which is the RTI::Exception destructor in this case (baseTypes.hh/line 31: virtual ~Exception();) Since the definition of RTI::Exception destructor is in RTITypes.cc, I assume typeinfo objects are only in libRTI.so. So we need to force the compiler to transfer the RTI::Exception typeinfo to libFedTime (if you want to keep those signatures as such). 2-character solution Make RTI::Exception destructor purely virtual (This way, there is no non-inline virtual function and so GCC seems to copy the typeinfo object to libFedTime - as it does not assume it must be somewhere else -) 2-line solution Copy the destructor definition to RTIfedTime.cc RTI::Exception::~Exception() { if (NULL!=_reason) { free(_reason); } } I tested with GCC only, they both work. Sebastien |
[Prev in Thread] | Current Thread | [Next in Thread] |