Я уверен, что этот вопрос задан раньше, но я искал SO настолько, насколько мог, и до сих пор не смог найти точную причину ошибки. Таким образом, выкладываем новый.LNK2019 неразрешенный внешний символ в конструкторе, несмотря на определение в cpp
Я использую библиотеку C++ (txmpp) в своем проекте. Библиотека добавлена правильно, но я получаю много нерешенных проблем с внешними символами, в основном в конструкторе классов, которые я пытаюсь использовать. Например, в следующем классе -
xmppthread.h
#ifndef _HELLO_XMPPTHREAD_H_
#define _HELLO_XMPPTHREAD_H_
#include "../../thread.h"
#include "../../xmppclientsettings.h"
#include "xmpppump.h"
namespace txmpp {
class XmppThread: public txmpp::Thread, XmppPumpNotify, txmpp::MessageHandler {
public:
XmppThread();
~XmppThread();
XmppClient* client() { return pump_->client(); }
void ProcessMessages(int cms);
void Login(const txmpp::XmppClientSettings & xcs);
void Disconnect();
private:
XmppPump* pump_;
void OnStateChange(txmpp::XmppEngine::State state);
void OnMessage(txmpp::Message* pmsg);
};
} // namespace txmpp
#endif // _HELLO_XMPPTHREAD_H_
xmppthread.cc
#include "xmppthread.h"
#include <assert.h>
#include "../../prexmppauthimpl.h"
#include "../../xmppasyncsocketimpl.h"
#include "../../xmppclientsettings.h"
namespace txmpp {
namespace {
const uint32 MSG_LOGIN = 1;
const uint32 MSG_DISCONNECT = 2;
struct LoginData : public MessageData {
LoginData(const XmppClientSettings& s) : xcs(s) {}
virtual ~LoginData() {}
XmppClientSettings xcs;
};
} // namespace
XmppThread::XmppThread() {
pump_ = new XmppPump(this);
}
XmppThread::~XmppThread() {
delete pump_;
}
void XmppThread::ProcessMessages(int cms) {
Thread::ProcessMessages(cms);
}
void XmppThread::Login(const XmppClientSettings& xcs) {
Post(this, MSG_LOGIN, new LoginData(xcs));
}
void XmppThread::Disconnect() {
Post(this, MSG_DISCONNECT);
}
void XmppThread::OnStateChange(XmppEngine::State state) {
}
void XmppThread::OnMessage(Message* pmsg) {
switch (pmsg->message_id) {
case MSG_LOGIN: {
assert(pmsg->pdata);
LoginData* data = reinterpret_cast<LoginData*>(pmsg->pdata);
pump_->DoLogin(data->xcs, new XmppAsyncSocketImpl(true),
new PreXmppAuthImpl());
delete data;
}
break;
case MSG_DISCONNECT:
pump_->DoDisconnect();
break;
default:
assert(false);
}
}
} // namespace hello
Я получаю следующее сообщение об ошибке -
1>XMPPController.obj : error LNK2019: unresolved external symbol "public: __thiscall txmpp::XmppThread::XmppThread(void)" ([email protected]@@[email protected]) referenced in function "public: void __thiscall XMPPController::Init(void)" ([email protected]@@QAEXXZ)
1>XMPPController.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall txmpp::XmppThread::~XmppThread(void)" ([email protected]@@[email protected]) referenced in function "public: void __thiscall XMPPController::Init(void)" ([email protected]@@QAEXXZ)
Я обычно вижу это kinda linker error только тогда, когда определение функции (конструктор/деструктор в этом случае) не является pr ovided. Однако, как вы видите, определение включено. Эта ошибка порождает только тогда, когда я делаю это в моем проекте -
xmpp::XmppThread thread;
Как только я удалить оператор объявления, ошибка сшивания идет. Проблема в том, что ни один из этих кодов не написан мной и не был взят из библиотеки txmpp. Этот конкретный класс из библиотеки libjingle Google, поэтому я уверен, что делаю здесь действительно глупую ошибку.
Я не хочу, чтобы этот вопрос был «Вот мой код, решите его». Вместо этого я хочу знать, какими могут быть обстоятельства, при которых может возникнуть неразрешенная ошибка внешнего символа, несмотря на объявление? (Код для доказательства того, что реализация там)
Любое предложение?
Update
Вот точные результаты я получаю после выключения Подавите вариант запуска баннера -
1>LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/FORCE' specification
1>AirPlaySystem.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:LBR' specification
1>LIBCMTD.lib(sscanf.obj) : warning LNK4006: _vsscanf already defined in s3e_d.lib(iwcrt_win32.obj); second definition ignored
1>LIBCMTD.lib(strtoq.obj) : warning LNK4006: _strtof already defined in s3e_d.lib(iwcrt_common.obj); second definition ignored
1> Creating library Debug_BarnC_vc12_x86\BarnC.lib and object Debug_BarnC_vc12_x86\BarnC.exp
1>XMPPController.obj : error LNK2019: unresolved external symbol "public: __thiscall txmpp::XmppThread::XmppThread(void)" ([email protected]@@[email protected]) referenced in function "public: void __thiscall XMPPController::Init(void)" ([email protected][email protected]@QAEXXZ)
1>XMPPController.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall txmpp::XmppThread::~XmppThread(void)" ([email protected]@@[email protected]) referenced in function "public: void __thiscall XMPPController::Init(void)" ([email protected]@@QAEXXZ)
1>Debug_BarnC_vc12_x86\BarnC.s86 : fatal error LNK1120: 2 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Update 2: Это подробный вывод линкера после добавления многословного компоновщика параметр командной строки -
1> Microsoft (R) Incremental Linker Version 12.00.31101.0
1> Copyright (C) Microsoft Corporation. All rights reserved.
1>
1> "/OUT:Debug_BarnC_vc12_x86\BarnC.s86" /INCREMENTAL /LIBPATH:d:/marmalade/7.4/modules/third_party/sqlite/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/iwutil/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/third_party/libjpeg/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/third_party/zlib/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/third_party/libpng/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/iw2d/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/iwgx/atitools /LIBPATH:d:/marmalade/7.4/modules/iwgx/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/iwgl/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/iwgeom/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/iwresmanager/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/iwgxfont/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/third_party/tiniconv/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/iwui/lib/x86 /LIBPATH:d:/marmalade/7.4/modules/iwhttp/lib/x86 /LIBPATH:d:/marmalade/7.4/extensions/s3etxmpp/lib/x86 /LIBPATH:d:/marmalade/7.4/s3e/lib/x86 vc6_compat.lib sqlite_d.lib iwutil_d.lib jpeg_d.lib z_d.lib png_d.lib iw2d_d.lib ATI_Compress_MT_VC7.lib iwgx_d.lib iwgl_d.lib iwgeom_d.lib iwresmanager_d.lib iwgxfont_ttf_d.lib tiniconv_d.lib iwui_d.lib iwhttp_d.lib s3eTxmpp_d.lib s3e_cpp_d.lib s3e_d.lib s3e_api_iwgl.lib /NODEFAULTLIB:libcmt /MANIFEST:NO /DEBUG "/PDB:Debug_BarnC_vc12_x86\BarnC.pdb" /SUBSYSTEM:WINDOWS /OPT:NOREF /OPT:NOICF /TLBID:1 "/ENTRY:DllEntryPoint" /DYNAMICBASE /NXCOMPAT "/IMPLIB:Debug_BarnC_vc12_x86\BarnC.lib" /MACHINE:X86 /include:_IwMain /include:_raise /include:[email protected] /force:multiple /VERBOSE:LIB /DLL Debug_BarnC_vc12_x86\AirPlaySystem.obj
1> Debug_BarnC_vc12_x86\CTextField.obj
1> Debug_BarnC_vc12_x86\Chat.obj
1> Debug_BarnC_vc12_x86\ChatController.obj
1> Debug_BarnC_vc12_x86\ChatGroup.obj
1> Debug_BarnC_vc12_x86\ChatMenu.obj
1> Debug_BarnC_vc12_x86\Contact.obj
1> Debug_BarnC_vc12_x86\ContactController.obj
1> Debug_BarnC_vc12_x86\HttpManager.obj
1> Debug_BarnC_vc12_x86\LoginMenu.obj
1> Debug_BarnC_vc12_x86\Main.obj
1> Debug_BarnC_vc12_x86\MainMenu.obj
1> Debug_BarnC_vc12_x86\MenuBase.obj
1> Debug_BarnC_vc12_x86\MenuController.obj
1> Debug_BarnC_vc12_x86\PVRTexTool_interface.obj
1> Debug_BarnC_vc12_x86\SimpleTouch.obj
1> Debug_BarnC_vc12_x86\UnivApp.obj
1> Debug_BarnC_vc12_x86\XMPPController.obj
1> Debug_BarnC_vc12_x86\md5c.obj
1>LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/FORCE' specification
1>AirPlaySystem.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:LBR' specification
1>
1> Searching libraries
1> Searching d:/marmalade/7.4/modules/third_party/sqlite/lib/x86\sqlite_d.lib:
1> Searching d:/marmalade/7.4/modules/iwutil/lib/x86\iwutil_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/libjpeg/lib/x86\jpeg_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/zlib/lib/x86\z_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/libpng/lib/x86\png_d.lib:
1> Searching d:/marmalade/7.4/modules/iw2d/lib/x86\iw2d_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgx/atitools\ATI_Compress_MT_VC7.lib:
1> Searching d:/marmalade/7.4/modules/iwgx/lib/x86\iwgx_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgl/lib/x86\iwgl_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgeom/lib/x86\iwgeom_d.lib:
1> Searching d:/marmalade/7.4/modules/iwresmanager/lib/x86\iwresmanager_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgxfont/lib/x86\iwgxfont_ttf_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/tiniconv/lib/x86\tiniconv_d.lib:
1> Searching d:/marmalade/7.4/modules/iwui/lib/x86\iwui_d.lib:
1> Searching d:/marmalade/7.4/modules/iwhttp/lib/x86\iwhttp_d.lib:
1> Searching d:/marmalade/7.4/extensions/s3etxmpp/lib/x86\s3eTxmpp_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_cpp_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_api_iwgl.lib:
1> Searching C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\OLDNAMES.lib:
1> Searching C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\LIBCMTD.lib:
1>LIBCMTD.lib(sscanf.obj) : warning LNK4006: _vsscanf already defined in s3e_d.lib(iwcrt_win32.obj); second definition ignored
1>LIBCMTD.lib(strtoq.obj) : warning LNK4006: _strtof already defined in s3e_d.lib(iwcrt_common.obj); second definition ignored
1> Searching C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x86\uuid.lib:
1> Searching C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x86\kernel32.lib:
1> Searching d:/marmalade/7.4/modules/third_party/sqlite/lib/x86\sqlite_d.lib:
1> Searching d:/marmalade/7.4/modules/iwutil/lib/x86\iwutil_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/libjpeg/lib/x86\jpeg_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/zlib/lib/x86\z_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/libpng/lib/x86\png_d.lib:
1> Searching d:/marmalade/7.4/modules/iw2d/lib/x86\iw2d_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgx/atitools\ATI_Compress_MT_VC7.lib:
1> Searching d:/marmalade/7.4/modules/iwgx/lib/x86\iwgx_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgl/lib/x86\iwgl_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgeom/lib/x86\iwgeom_d.lib:
1> Searching d:/marmalade/7.4/modules/iwresmanager/lib/x86\iwresmanager_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgxfont/lib/x86\iwgxfont_ttf_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/tiniconv/lib/x86\tiniconv_d.lib:
1> Searching d:/marmalade/7.4/modules/iwui/lib/x86\iwui_d.lib:
1> Searching d:/marmalade/7.4/modules/iwhttp/lib/x86\iwhttp_d.lib:
1> Searching d:/marmalade/7.4/extensions/s3etxmpp/lib/x86\s3eTxmpp_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_cpp_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_api_iwgl.lib:
1> Searching C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\OLDNAMES.lib:
1> Searching C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\LIBCMTD.lib:
1> Searching C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x86\uuid.lib:
1> Searching C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x86\kernel32.lib:
1> Searching d:/marmalade/7.4/modules/third_party/sqlite/lib/x86\sqlite_d.lib:
1> Searching d:/marmalade/7.4/modules/iwutil/lib/x86\iwutil_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/libjpeg/lib/x86\jpeg_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/zlib/lib/x86\z_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/libpng/lib/x86\png_d.lib:
1> Searching d:/marmalade/7.4/modules/iw2d/lib/x86\iw2d_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgx/atitools\ATI_Compress_MT_VC7.lib:
1> Searching d:/marmalade/7.4/modules/iwgx/lib/x86\iwgx_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgl/lib/x86\iwgl_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgeom/lib/x86\iwgeom_d.lib:
1> Searching d:/marmalade/7.4/modules/iwresmanager/lib/x86\iwresmanager_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgxfont/lib/x86\iwgxfont_ttf_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/tiniconv/lib/x86\tiniconv_d.lib:
1> Searching d:/marmalade/7.4/modules/iwui/lib/x86\iwui_d.lib:
1> Searching d:/marmalade/7.4/modules/iwhttp/lib/x86\iwhttp_d.lib:
1> Searching d:/marmalade/7.4/extensions/s3etxmpp/lib/x86\s3eTxmpp_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_cpp_d.lib:
1>
1> Finished searching libraries
1> Creating library Debug_BarnC_vc12_x86\BarnC.lib and object Debug_BarnC_vc12_x86\BarnC.exp
1>
1> Searching libraries
1> Searching d:/marmalade/7.4/modules/third_party/sqlite/lib/x86\sqlite_d.lib:
1> Searching d:/marmalade/7.4/modules/iwutil/lib/x86\iwutil_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/libjpeg/lib/x86\jpeg_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/zlib/lib/x86\z_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/libpng/lib/x86\png_d.lib:
1> Searching d:/marmalade/7.4/modules/iw2d/lib/x86\iw2d_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgx/atitools\ATI_Compress_MT_VC7.lib:
1> Searching d:/marmalade/7.4/modules/iwgx/lib/x86\iwgx_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgl/lib/x86\iwgl_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgeom/lib/x86\iwgeom_d.lib:
1> Searching d:/marmalade/7.4/modules/iwresmanager/lib/x86\iwresmanager_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgxfont/lib/x86\iwgxfont_ttf_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/tiniconv/lib/x86\tiniconv_d.lib:
1> Searching d:/marmalade/7.4/modules/iwui/lib/x86\iwui_d.lib:
1> Searching d:/marmalade/7.4/modules/iwhttp/lib/x86\iwhttp_d.lib:
1> Searching d:/marmalade/7.4/extensions/s3etxmpp/lib/x86\s3eTxmpp_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_cpp_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_api_iwgl.lib:
1> Searching C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\OLDNAMES.lib:
1> Searching C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\LIBCMTD.lib:
1> Searching C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x86\uuid.lib:
1> Searching C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x86\kernel32.lib:
1>
1> Finished searching libraries
1>
1> Searching libraries
1> Searching d:/marmalade/7.4/modules/third_party/sqlite/lib/x86\sqlite_d.lib:
1> Searching d:/marmalade/7.4/modules/iwutil/lib/x86\iwutil_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/libjpeg/lib/x86\jpeg_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/zlib/lib/x86\z_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/libpng/lib/x86\png_d.lib:
1> Searching d:/marmalade/7.4/modules/iw2d/lib/x86\iw2d_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgx/atitools\ATI_Compress_MT_VC7.lib:
1> Searching d:/marmalade/7.4/modules/iwgx/lib/x86\iwgx_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgl/lib/x86\iwgl_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgeom/lib/x86\iwgeom_d.lib:
1> Searching d:/marmalade/7.4/modules/iwresmanager/lib/x86\iwresmanager_d.lib:
1> Searching d:/marmalade/7.4/modules/iwgxfont/lib/x86\iwgxfont_ttf_d.lib:
1> Searching d:/marmalade/7.4/modules/third_party/tiniconv/lib/x86\tiniconv_d.lib:
1> Searching d:/marmalade/7.4/modules/iwui/lib/x86\iwui_d.lib:
1> Searching d:/marmalade/7.4/modules/iwhttp/lib/x86\iwhttp_d.lib:
1> Searching d:/marmalade/7.4/extensions/s3etxmpp/lib/x86\s3eTxmpp_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_cpp_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_d.lib:
1> Searching d:/marmalade/7.4/s3e/lib/x86\s3e_api_iwgl.lib:
1> Searching C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\OLDNAMES.lib:
1> Searching C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\LIBCMTD.lib:
1> Searching C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x86\uuid.lib:
1> Searching C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x86\kernel32.lib:
1>
1> Finished searching libraries
1>XMPPController.obj : error LNK2019: unresolved external symbol "public: __thiscall txmpp::XmppThread::XmppThread(void)" ([email protected]@@[email protected]) referenced in function "public: void __thiscall XMPPController::Init(void)" ([email protected]@@QAEXXZ)
1>XMPPController.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall txmpp::XmppThread::~XmppThread(void)" ([email protected]@@[email protected]) referenced in function "public: void __thiscall XMPPController::Init(void)" ([email protected]@@QAEXXZ)
1>Debug_BarnC_vc12_x86\BarnC.s86 : fatal error LNK1120: 2 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Обратите внимание, что идентификаторы, начинающиеся с символа подчеркивания, за которым следует буква верхнего регистра, как '_HELLO_XMPPTHREAD_H_', зарезервированы для реализации. –
Хм, похоже, вы не связываетесь с объектным кодом xmppthread.cc. Вы уверены, что вы его компилируете и связываете. Или что объектный код является частью некоторой библиотеки, в которую вы вставляете. Если это кажется ОК, рассмотрите * порядок * ссылок. Это имеет значение с g ++. О, это VIsual C++. Тогда порядок не так важен. –
Спасибо за ответ. Да, у меня такое же впечатление, что реализация не связана вообще. Хотя я не уверен, как я могу это проверить? Есть ли способ проверить связь? – noob