2016-07-08 15 views
8

Wir bekommen seltsame ungelöste Symbole, die Fehler verlinken, seit wir auf Visual Studio 2015 Update 3 aktualisiert haben.Nicht aufgelöste externe Symbole seit Visual Studio 2015 Update 3: Boost-Python-Verknüpfungsfehler, wenn Destruktor virtuell ist

Was wirklich seltsam ist, ist, dass boost :: get_pointer eine Template-Methode ist, die in einem Boost-Header definiert ist. Ich verstehe nicht, wie wir ein nicht definiertes externes Symbol in diesem Fall bekommen :(

Hier ist ein Wiedergabegerät, mit Boost 1,61 und Python 3.5.1.

#include <vector> 
#include <boost/python.hpp> 

using namespace boost::python; 

class Canard { 
public: 
    Canard() {} 
    virtual ~Canard() {} 
}; 

BOOST_PYTHON_MODULE(coin) 
{ 
    register_ptr_to_python< std::shared_ptr<Canard> >(); 
} 

Und der Fehler:

Severity Code Description Project File Line 
Error LNK2019 unresolved external symbol "class Canard const volatile * __cdecl boost::get_pointer<class Canard const volatile >(class Canard const volatile *)" ([email protected][email protected]@@[email protected]@[email protected]@[email protected]@Z) referenced in function "private: static struct _typeobject * __cdecl boost::python::objects::make_ptr_instance<class Canard,struct boost::python::objects::pointer_holder<class std::shared_ptr<class Canard>,class Canard> >::get_derived_class_object<class Canard>(struct boost::mpl::bool_<1>,class Canard const volatile *)" ([email protected]@@@[email protected]@@[email protected][email protected]@@@[email protected]@[email protected]@@[email protected]@[email protected]@@[email protected]@[email protected]@[email protected]@[email protected][email protected]@[email protected]@@@Z) CCMasterKernelPyPy C:\work\dev\builds\internal\Master\SDK\MasterKernelPyPy\main.obj 1 

Aber sobald ich die virtuelle vor dem Destruktor der Canard Klasse entfernen, dann beginnt es funktioniert .... Hat jemand eine Ahnung? Ist es ein Visual Studio Bug?

Antwort

9

Visual Studio 2015 Update 3 hat viele Funktionen und Verbesserungen hinzugefügt (siehe Release Notes https://www.visualstudio.com/news/releasenotes/vs2015-update3-vs#visualcpp). Es gibt auch einige bekannte Probleme (https://msdn.microsoft.com/vs-knownissues/vs2015-update3 siehe den Abschnitt Nicht-Zeiger-ähnliche Typen an uninitialized_copy übergeben).

Um dies zu beheben Ihr Problem Sie müssen explizit auf die Umstellung auf Zeiger der Klasse angeben, ausdrücklich:

namespace boost 
{ 
    template <> 
    Canard const volatile * get_pointer<class Canard const volatile >(
     class Canard const volatile *c) 
    { 
     return c; 
    } 
} 

Viel Glück, Ohad

+0

Es funktioniert! Danke für die Links und die Reparatur! – CanardMoussant

+1

Ein [Bug] (https://connect.microsoft.com/VisualStudio/Feedback/Details/2852624) wurde für dieses Problem im Visual Studio-Fehlerverfolger abgelegt und enthält eine ähnliche Problemumgehung wie Ohad vorgeschlagen. Möglicherweise möchten Sie den Status und die Kommentare des Fehlers im Auge behalten, falls bei der nächsten Aktualisierung von Visual Studio ein Compilerfix hinzugefügt wird. – TaylorP

+0

Vielen Dank für die Problemumgehung. Ich konnte es nicht für abstrakte Klassen schaffen, wenn es ein Include für 'boost/optional.hpp' gibt, weil die 'get_pointer'-Überladung irgendwie versucht,' boost :: optional 'zu instanziieren. Kennen Sie eine andere mögliche Problemumgehung für diesen Fall? –