Обновлена ​​Visual Studio, теперь wxWidgets жалуется на неразрешенные символы - PullRequest
0 голосов
/ 23 ноября 2018

Описание проблемы:

  1. У меня есть проект Visual Studio 2012 C ++, который использует wxWidgets.Он прекрасно компилируется и связывается.
  2. По причинам, в которые мы не будем вдаваться, теперь мне нужно выполнить эту работу с Visual Studio 2015.
  3. Перевернув настройки и получив весь код для компиляциитеперь он отказывается связываться, потому что все библиотеки, которые он использует, скомпилированы для VS 2012. ОК ...
  4. Я заменил все библиотеки на библиотеки, скомпилированные для 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).

Я не понимаю, в чем проблема.Я не понимаю, почему он жалуется на меня.Но мне нужно сделать эту работу.Есть предложения?

Ответы [ 4 ]

0 голосов
/ 27 ноября 2018

В конце концов я сдался и попытался создать wxWidgets из исходного кода.

Потребовалось много, много попыток, но в итоге я смог скомпилировать wxWidgets таким образом, что мое приложение теперьстроит успешно.Кажется, вам нужно проверить, что все сотни тысяч параметров компиляции в VS идентичны целевому приложению.Нет, кажется, невозможно автоматизировать это.

(Сказав все это, по сравнению с тем, как ужасно сложно обычно создать что-либо, связанное с C из источника, это было сравнительно легко ...)

0 голосов
/ 24 ноября 2018

Ошибка вашей ссылки связана с тем, что компоновщик ищет функцию в статической библиотеке, когда вы связываетесь с библиотеками импорта DLL.IOW, когда вы пишете

Другими словами, точный символ, который VS говорит, что не может найти!

, это просто неправильно, потому что есть явная разница: одинсимвол имеет префикс __imp__, а другой - нет.

Либо перестройте приложение с определением WXUSINDLL, либо связывайте со статическими библиотеками wx.

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

0 голосов
/ 27 ноября 2018

Помимо великолепной помощи от Vadim и Ripi2, я думаю, вы также пытаетесь обновить wxWidgets с версии 2.8 до 3.0.Само по себе это огромная задача, и вам следует подумать о том, чтобы сделать одно правильно, а затем другое.

Я бы начал со статического исходного кода сборки 2.8 с помощью имеющегося компилятора, а затем попытался очень аккуратно обновить версию wxWidgets..

Спасибо.

0 голосов
/ 23 ноября 2018

Смешивание скомпилированных файлов из разных версий VS приведет к ошибкам («не найден» или «несовместим») на этапе компоновки.Кроме того, смешивание 32/64 версий не удастся.

Удалить (или переместить в другой каталог) все [старые] вещи wxWidgets, особенно сгенерированные каталоги и объекты во время предыдущего построения wxWidgets.

Загрузите текущие источники wxWidgets с официальной страницы или установщика Windows.

Сборка с использованием правильного решения VS.Взято из wxdir\docs\msw\install.txt:

Готовые к использованию файлы проекта предоставляются для VC ++ версий 7, 8, 9, 10, 11, 12, 14 и 15 (также известный как MSVS 2003, 2005, 2008)., 2010, 2012, 2013, 2015 и 2017 соответственно).

Просто откройте файл wx_vcN.sln (для N = 7, 8, 9, 10, 11, 12, 14 или 15) и выберите соответствующийКонфигурация (Debug или Release, статическая или DLL) и построить решение.Обратите внимание, что при построении конфигурации DLL может потребоваться выполнить сборку несколько раз, поскольку проекты не всегда создаются в правильном порядке, и это может привести к ошибкам соединения.Просто повторите сборку, до 3 раз, чтобы исправить это.

Итак, просто откройте wx_vc14.sln и постройте свое решение.Кажется, вам нужна библиотека static, поэтому wx встроен в ваше приложение;если нет, выберите решение DLL.

Обратите внимание, что на этой странице загрузки wxWidgets вы можете напрямую получить заголовки и статические ("Development") или динамические ("Release DLL") уже скомпилированные файлы, чтобыизбегайте самой компиляции wxWidgets.

...