Ошибка связывания с boost::make_shared и paho.mqtt.cpp

Для проекта я хочу использовать хороший пакет paho.mqtt.cpp SDK и использовать его со старой версией msvc10. В paho.mqtt.cpp массово используются расширения c+11, поэтому мне пришлось изменить много исходного кода, чтобы он работал с компилятором msvc10. Должно быть заменено все, что нужно, и теперь я могу скомпилировать и связать саму библиотеку.

Когда я пытаюсь использовать эту модифицированную библиотеку paho.mqtt.cpp-msvc10 в других проектах, я всегда получаю ошибки компоновки. Они похожи:

LNK2019 unresolved external symbol "public: __cdecl mqtt::buffer_ref<char>::buffer_ref<char>(class mqtt::buffer_ref<char> &&)" (??0?$buffer_ref@D@mqtt@@QEAA@$$QEAV01@@Z) referenced in function "class boost::shared_ptr<class mqtt::message> __cdecl boost::make_shared<class mqtt::message,class mqtt::buffer_ref<char>,void const * &,unsigned __int64 &,int &,bool &>(class mqtt::buffer_ref<char> &&,void const * &,unsigned __int64 &,int &,bool &)" (??$make_shared@Vmessage@mqtt@@V?$buffer_ref@D@2@AEAPEBXAEA_KAEAHAEA_N@boost@@YA?AV?$shared_ptr@Vmessage@mqtt@@@0@$$QEAV?$buffer_ref@D@mqtt@@AEAPEBXAEA_KAEAHAEA_N@Z)   async_consume
LNK2001 unresolved external symbol "public: __cdecl mqtt::buffer_ref<char>::buffer_ref<char>(void)" (??0?$buffer_ref@D@mqtt@@QEAA@XZ)   async_consume
LNK2001 unresolved external symbol "public: class mqtt::buffer_ref<char> & __cdecl mqtt::buffer_ref<char>::operator=(class mqtt::buffer_ref<char> &&)" (??4?$buffer_ref@D@mqtt@@QEAAAEAV01@$$QEAV01@@Z) async_consume

и еще немного того же рода...

То же самое происходит, когда я пытаюсь собрать поставленные примеры в paho.mqtt.cpp SDK.

У кого-нибудь есть идеи? Весь источник доступен по адресу https://github.com/eclipse/paho.mqtt.cpp

Это может быть тот же случай, что и в: Почему я получаю нерешенные внешние проблемы? но я не могу найти отсутствующий шаблон в случае...

Я собираюсь исправить это самостоятельно... проблема в операциях перемещения и копирования в c+11. Операции по умолчанию были удалены моим преобразованием, но я забыл реализовать их самостоятельно:

Например: оператор копирования до:

buffer_ref& operator=(const buffer_ref& rhs)= default

Для c+0x мы должны реализовать это самостоятельно:

buffer_ref& operator=(const buffer_ref& rhs)
{
    //added copying by spiesra
    if (this != &rhs)
    {

        data_.reset();
        data_ = rhs.ptr();
        data_.reset(new blob(reinterpret_cast<const value_type*>(rhs.data()), rhs.size()));
    }
    return *this;
}

или оператор перемещения в с + 11

buffer_ref& operator=(buffer_ref&& rhs) == default   

и наша собственная реализация:

buffer_ref& operator=(buffer_ref&& rhs)
{
    //added moving by spiesra
    if (this != &rhs)
    {
        data_.reset();
        data_ = rhs.ptr();
        rhs.reset();
    }
    return *this;
}

Верны ли мои собственные реализации?

0 ответов

Другие вопросы по тегам