Описание проблемы:
- У меня есть проект Visual Studio 2012 C ++, который использует wxWidgets.Он прекрасно компилируется и связывается.
- По причинам, в которые мы не будем вдаваться, теперь мне нужно выполнить эту работу с Visual Studio 2015.
- Перевернув настройки и получив весь код для компиляциитеперь он отказывается связываться, потому что все библиотеки, которые он использует, скомпилированы для VS 2012. ОК ...
- Я заменил все библиотеки на библиотеки, скомпилированные для VS 2015. Все работает снова ... , кроме wxWidgets.
Я потратил несколько дней , бесплодно пытаясь заставить работать wxWidgets.Это просто не сработает.
Вот что я сделал до сих пор:
- Глядя на инструкции на https://github.com/wxWidgets/wxWidgets/releases/,, похоже, я должензагрузите и распакуйте два файла:
wxWidgets-3.1.1-headers.7z
(который содержит папку include
) wxMSW-3.1.1_vc140_Dev.7z
(который содержит папку lib
).
- Я удалил старый материал wxWidgets и распаковал эти два новых zip-файла.
- Сотни ошибок препроцессора, говорящих о том, что он не может найти какой-либо включаемый файл.Похоже, что старая структура каталогов имела
...\lib\vc_lib\...
, а не ..\lib\vc140_dll\...
, поэтому я попытался переименовать папку.Теперь все успешно компилируется. - Далее компоновщик жалуется, что не может найти
wxbmsw28ud_core.lib
- что имеет смысл, учитывая, что я только что удалил его.Я изменил все имена файлов на *31
, а не *28
, и больше никаких ошибок, связанных с отсутствием файлов. - Теперь у меня сотни ошибок LNK2001.Например:
Ошибка LNK2001 неразрешенный внешний символ "защищено: статическая структура wxEventTable const wxDialogBase :: sm_eventTable" (? Sm_eventTable @ wxDialogBase @@ 1UwxEventTable @@ B)
Хотя я этого не понимаю.Если я запускаю DumpBin.exe
против wxmsw31ud_core.lib
, он выдает несколько мегабайт текста, включая:
5146A2 __imp_?sm_eventTable@wxDialogBase@@1UwxEventTable@@B
, а также
29C0 __imp_?sm_eventTable@wxDialogBase@@1UwxEventTable@@B
, а также
Version : 0
Machine : 14C (x86)
TimeDateStamp: 5A8A0543 Sun Feb 18 22:59:15 2018
SizeOfData : 00000049
DLL name : wxmsw311ud_core_vc140.dll
Symbol name : ?sm_eventTable@wxDialogBase@@1UwxEventTable@@B (protected: static struct wxEventTable const wxDialogBase::sm_eventTable)
Type : data
Name type : name
Hint : 14306
Name : ?sm_eventTable@wxDialogBase@@1UwxEventTable@@B
Другими словами, точный символ, который VS не может найти!
Так что, если символ в файле .lib
, и я могу посмотрите , почему VS жалуется на то, что его нет в файле .lib
?
Чтобы быть на 100% уверенным, я составил таблицу для каждого символа, который VS утверждает, что можетне можете найти и в каком файле .lib
он находится:
LNK2001 ?sm_eventTable@wxDialogBase@@1UwxEventTable@@B wxmsw31ud_core.lib
LNK2001 ?wxTheAssertHandler@@3P6AXABVwxString@@H000@ZA wxbase31ud.lib
LNK2001 ?wxTrapInAssert@@3_NA wxbase31ud.lib
LNK2001 ?wxConvLibcPtr@@3PAVwxMBConv@@A wxbase31ud.lib
LNK2001 ?wxEmptyString@@3PB_WB wxbase31ud.lib
LNK2001 ?npos@wxString@@2IB wxbase31ud.lib
LNK2001 ?sm_first@wxClassInfo@@0PAV1@A wxbase31ud.lib
LNK2001 ?wxNullBitmap@@3VwxBitmap@@A wxmsw31ud_core.lib
LNK2001 ?wxNullIcon@@3VwxIcon@@A wxmsw31ud_core.lib
LNK2001 ?wxDefaultSize@@3VwxSize@@B wxmsw31ud_core.lib
LNK2001 ?wxDefaultPosition@@3VwxPoint@@B wxmsw31ud_core.lib
LNK2001 ?wxEVT_NULL@@3HB wxbase31ud.lib
LNK2001 ?wxEVT_BUTTON@@3V?$wxEventTypeTag@VwxCommandEvent@@@@B wxmsw31ud_core.lib
LNK2001 ?wxDefaultValidator@@3VwxValidator@@B wxmsw31ud_core.lib
LNK2001 ?wxButtonNameStr@@3QBDB wxmsw31ud_core.lib
LNK2001 ?ms_classInfo@wxDialog@@2VwxClassInfo@@A wxmsw31ud_core.lib
LNK2001 ?wxStaticTextNameStr@@3QBDB wxmsw31ud_core.lib
LNK2001 ?wxListCtrlNameStr@@3QBDB wxmsw31ud_core.lib
LNK2001 ?wxConvUTF8Ptr@@3PAVwxMBConvStrictUTF8@@A wxbase31ud.lib
LNK2001 ?ms_appInitFn@wxAppConsoleBase@@1P6APAVwxAppConsole@@XZA wxbase31ud.lib
LNK2001 ?ms_appInstance@wxAppConsoleBase@@1PAVwxAppConsole@@A wxbase31ud.lib
LNK2001 ?ms_idMainThread@wxThread@@0KA wxbase31ud.lib
LNK2001 ?wxEVT_CLOSE_WINDOW@@3V?$wxEventTypeTag@VwxCloseEvent@@@@B wxmsw31ud_core.lib
LNK2001 ?wxEVT_SIZING@@3V?$wxEventTypeTag@VwxSizeEvent@@@@B wxmsw31ud_core.lib
LNK2001 ?wxEVT_COMMAND_ENTER@@3V?$wxEventTypeTag@VwxCommandEvent@@@@B wxmsw31ud_core.lib
LNK2001 ?wxTextCtrlNameStr@@3QBDB wxmsw31ud_core.lib
LNK2001 ?wxGaugeNameStr@@3QBDB wxmsw31ud_core.lib
LNK1120 28 unresolved externals
Как видите, каждый отдельный символ указан в wxmsw31ud_core.lib
или wxbase31ud.lib
, которые оба настроены в проекте (вместе с несколькими дополнительными библиотеками wxWidgets).
Я не понимаю, в чем проблема.Я не понимаю, почему он жалуется на меня.Но мне нужно сделать эту работу.Есть предложения?