2016-07-08 13 views
8

Stiamo ricevendo strani simboli non risolti che collegano gli errori da quando abbiamo aggiornato l'aggiornamento di Visual Studio 2015 3. Qualcun altro ha riscontrato lo stesso tipo di problemi?Simboli esterni non risolti dall'aggiornamento 3 di Visual Studio 2015: errore di collegamento boost python se il distruttore è virtuale

Ciò che è veramente strano è che boost :: get_pointer è un metodo di template, definito in un'intestazione di boost. Non capisco come si possa ottenere un simbolo esterno non definito in quel caso :(

Ecco un riproduttore, con boost 1,61 e 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> >(); 
} 

E l'errore:

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]@[email protected]@@Z) CCMasterKernelPyPy C:\work\dev\builds\internal\Master\SDK\MasterKernelPyPy\main.obj 1 

Ma appena tolgo il virtuale davanti al distruttore della classe Canard, poi comincia a lavorare .... qualcuno ha un indizio? si tratta di un bug di Visual Studio?

risposta

9

Visual Studio 2015l'aggiornamento 3 ha aggiunto molte funzionalità e miglioramenti (vedere le note di rilascio https://www.visualstudio.com/news/releasenotes/vs2015-update3-vs#visualcpp). Ha anche alcuni problemi noti (https://msdn.microsoft.com/vs-knownissues/vs2015-update3 vedere la sezione Passare i tipi non puntatore alla sezione non inizializzata_copia).

per risolvere il problema è necessario specificare esplicitamente la conversione a puntatore della classe, in modo esplicito:

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

Buona fortuna, Ohad

+0

Funziona! Grazie per i link e la soluzione! – CanardMoussant

+1

Un [bug] (https://connect.microsoft.com/VisualStudio/Feedback/Details/2852624) è stato archiviato per questo problema nel bug tracker di Visual Studio ed elenca una soluzione simile a quella suggerita da Ohad. Si consiglia di tenere traccia dello stato e dei commenti del bug nel caso in cui venga aggiunta una correzione del compilatore nel prossimo aggiornamento a Visual Studio. – TaylorP

+0

Grazie per la soluzione. Non potrei farlo funzionare per le classi astratte quando c'è un include a 'boost/optional.hpp' perché il sovraccarico di' get_pointer' tenta in qualche modo di istanziare 'boost :: opzionale '. Conosci altre soluzioni alternative per questo caso? –

Problemi correlati