Компоновщик Visual C жалуется на отсутствие символа, который не отсутствует

#visual-c #linker-errors

#visual-c #компоновщик -ошибки

Вопрос:

Короче говоря: на Visual C 2015 я получаю ошибку компоновщика, жалующуюся на отсутствие символов, которые присутствуют в .файл библиотеки, на который я ссылаюсь.


В long: при компиляции и просмотре какой-либо программы из командной строки с cl.exe Я получаю следующее в качестве первой из многих ошибок:

 main.obj : error LNK2001: unresolved external symbol "protected: static struct wxEventTable const wxApp::sm_eventTable" (?sm_eventTable@wxApp@@1UwxEventTable@@B)
 

AFAIK, эта длинная строка говорит о том, что мой main.obj ссылается на функцию, с которой связан символ ?sm_eventTable@wxApp@@1UwxEventTable@@B, но компоновщик не смог найти этот символ в (длинном) списке библиотек, который я предоставил в командной строке.

Я компилирую в режиме /MD. Не знаю, помогает ли это, вредит или не имеет значения здесь.

Один из файлов, с которым я связываюсь, — wxmsw31u_core .библиотека и выполнение

корзина / заголовки wxmsw31u_core.lib > here.txt

выдает длинный файл, содержащий следующее

   Version      : 0
  Machine      : 8664 (x64)
  TimeDateStamp: 56D46194 Mon Feb 29 16:19:48 2016
  SizeOfData   : 00000045
  DLL name     : wxmsw310u_core_vc140_x64.dll
  Symbol name  : ?sm_eventTable@wxApp@@1UwxEventTable@@B (protected: static struct wxEventTable const wxApp::sm_eventTable)
  Type         : data
  Name type    : name
  Hint         : 14083
  Name         : ?sm_eventTable@wxApp@@1UwxEventTable@@B
 

Из этого я делаю вывод, что wxmsw31u_core.библиотека это «библиотека импорта»: другими словами, это означает, что эта библиотека не содержит кода, а просто ссылается на DLL-файл wxmsw310u_core_vc140_x64.dll это на самом деле содержит код.

Последнее wxmsw310u_core_vc140_x64.dll файл действительно упоминает?sm_eventTable@wxApp@@1UwxEventTable@@B как я проверил:

корзина / ЭКСПОРТ wxmsw310u_core_vc140_x64.dll > here2.txt

дал

   14084 3703 0057F008 ?sm_eventTable@wxApp@@1UwxEventTable@@B = ?sm_eventTable@wxApp@@1UwxEventTable@@B (protected: static struct wxEventTable const wxApp::sm_eventTable)
 

Я отмечаю, что первое число равно подсказке предыдущего заголовка плюс один. Я полагаю, это нормально?

Я потратил время, чтобы проверить DLL, как указано выше, но AFAIK, DLL не требуется в процессе компоновки (требуется при вызове созданного .exe).

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


Редактировать

Я частично решил проблему, самостоятельно скомпилировав библиотеку вместо использования скомпилированных двоичных файлов для Windows, предоставляемых wxWidgets: Теперь я могу скомпилировать свою программу, и все хорошо.

Ну, не все: первоначальный вопрос остается. У меня была ситуация, когда я пытался связать obj с библиотекой, чтобы получить exe, obj ссылается на символ, искаженное имя которого дословно присутствует в библиотеке, компоновщик загружает obj и библиотеку (подтверждено с помощью /VERBOSE), но компоновщик отказывается рассматривать символ как «решаемая «. Почему?

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

Ответ №1:

AFAIK, в этой длинной строке говорится, что мой main.obj ссылается на функцию, к которой относится символ?

Да, компоновщик не может найти sm_eventTable@wxApp@@1UwxEventTable@@B по указанным вами путям.

Убедитесь, что у вас правильно настроен Additional Library Path параметр и что целевая платформа вашего приложения /Machine:X64

Комментарии:

1. Спасибо за ваш ответ. В моей командной строке действительно есть /MACHINE:X64 и /LIBPATH:»путь к библиотеке» (в любом случае без библиотеки компоновщик останавливается на более раннем шаге).

2. @Arnaud /LIBPATH должен быть путем к каталогу, а не к самому файлу библиотеки

3. /LIBPATH:»%WXBASE% lib vc_x64_lib» и ранее в моем командном файле я УСТАНОВИЛ «WXBASE= D: wxWidgets» и D:wxWidgetslibvc_x64_lib является каталогом, который содержит файл wxmsw31u_core. библиотека и многое другое Может быть, мне следует поместить сюда весь исходный код пакетного файла (я немного стесняюсь этого)

4. @Arnaud Вы сами создаете библиотеки? Я спрашиваю, потому что у меня есть libvc140_x64_dll папка со всеми библиотеками и библиотеками DLL. Попробуйте использовать официальную сборку wxMSW-3.1.0_vc140_Dev.7z . wxbase31u.lib также должен быть среди связанных библиотек.

5. На этот раз я не создал библиотеку. Возможно, это то, что я должен сделать, я хотел избежать этой боли.