Клиентская библиотека XMPP gloox - компоновщик не может найти символ - PullRequest
2 голосов
/ 06 ноября 2011

Я полностью озадачен этой проблемой и не могу понять, как решить эту проблему.

По сути, я скомпилировал библиотеку gloox в Visual Studio 2010 (которая прекрасно работала с незначительными изменениями) и получил файлы .lib и .dll. Сейчас я пытаюсь использовать это в другой программе, которая использует много глокс-функций. Я могу связать большинство символов в порядке, кроме одного:

1>test.obj : error LNK2001: unresolved external symbol "class
std::basic_string<char,struct std::char_traits<char>,
class std::allocator<char> > 
const gloox::EmptyString" (?EmptyString@gloox@@3V?$basic_string@DU?$
char_traits@D@std@@V?$allocator@D@2@@std@@B)

Когда я делаю подробное связывание моей программы, я вижу, что все другие символы из gloox lib связаны с штрафом:

1>      Searching ..\..\lib\lib\gloox 1.0.lib:
1>        Found "public: virtual __thiscall gloox::Message::~Message(void)" (??       1Message@gloox@@UAE@XZ)
1>          Referenced in test.obj
1>          Loaded gloox 1.0.lib(gloox 1.0.dll)
1>        Found "public: __thiscall gloox::Message::Message(enum   gloox::Message::MessageType,class gloox::JID const &,class std::basic_string<char,struct  std::char_traits<char>,class std::allocator<char> > const &,class  std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0Message@gloox@@QAE@W4MessageType@01@ABVJID@1@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@222@Z)
1>          Referenced in test.obj
1>          Loaded gloox 1.0.lib(gloox 1.0.dll)
1>        Found "public: void __thiscall gloox::ClientBase::registerPresenceHandler(class gloox::PresenceHandler *)" (?registerPresenceHandler@ClientBase@gloox@@QAEXPAVPresenceHandler@2@@Z)
1>          Referenced in test.obj
1>          Loaded gloox 1.0.lib(gloox 1.0.dll)
...

Так что я подумал, может символ не экспортируется правильно, и я сделал это:

dumpbin.exe / exports gloox 1.0.lib

И среди прочего я видел это:

??_FXHtmlIM@gloox@@QAEXXZ (public: void __thiscall gloox::XHtmlIM::`default constructor closure'(void))
?EmptyString@gloox@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@B (class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const gloox::EmptyString)
?GLOOX_CAPS_NODE@gloox@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@B (class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const gloox::GLOOX_CAPS_NODE)

Вторая строка показывает, что символ был экспортирован в порядке.

Теперь единственное различие, о котором я могу думать, состоит в том, что правильно загружаемые символы - это все функции, и этот конкретный является переменной. Тем не менее, до тех пор, пока его экспортированное право, компоновщик должен его видеть, верно?

Любая помощь будет принята с благодарностью. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 19 июля 2013

Старый пост, но может быть полезен другим.

Решение состоит в том, чтобы убедиться, что GLOOX_IMPORTS определено. Используется в macros.h для определения:

define GLOOX_API __declspec( dllexport )
0 голосов
/ 31 декабря 2014

Недавно я также столкнулся с подобной проблемой, когда пытался скомпилировать код, связанный с gloox.

Я обнаружил, что это потому, что проект библиотеки не включает исходный файл, который имеет определение так называемого неразрешенного внешнего символа.

В вашем случае неразрешенный внешний символ: gloox :: EmptyString Это определено в gloox.cpp.

Итак, проверьте ваш проект библиотеки gloox , делает его

Включен список исходных файлов gloox.cpp ?

Включен список заголовочных файлов gloox.h?

Если он отсутствует, пожалуйста, включите , тогда я думаю, что вы исправите эту ошибку. Я использовал один день, чтобы выяснить это, поскольку предполагал, что проект библиотеки, который я скачал с веб-сайта gloox, должен включать все необходимые исходные файлы, но на самом деле это не то, что я предполагал!

Как я проверил ?

Я изменяю на build dll вместо lib в проекте библиотеки. Если у вас та же ошибка во время компиляции dll в проекте библиотеки gloox, Затем вы должны проверить, содержит ли ваш библиотечный проект gloox.cpp.

0 голосов
/ 21 августа 2012

Не знаю, если вы все еще застряли на этом, но я исправил эту проблему, изменив файл message.h в глокс включает.Я изменяю конструктор с:

Message( MessageType type, const JID& to,
         const std::string& body = EmptyString, const std::string& subject = EmptyString,
         const std::string& thread = EmptyString, const std::string& xmllang = EmptyString );

на:

Message( MessageType type, const JID& to,
         const std::string& body = "", const std::string& subject = "",
         const std::string& thread = "", const std::string& xmllang = "" );
...