Ошибка связывания с 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;
}
Верны ли мои собственные реализации?