Вкратце: на Visual C++ 2015 я получаю ошибку компоновщика, жалуясь на отсутствие символов, присутствующих в файле .lib, с которым я ссылаюсь.Visual C++ компоновщик жалуется на отсутствие символа, который не отсутствует
При продолжительном: При составлении-и-душе какой-то программы из командной строки с cl.exe я получаю следующее, как первые из многих ошибок:
main.obj : error LNK2001: unresolved external symbol "protected: static struct wxEventTable const wxApp::sm_eventTable" ([email protected]@@[email protected]@B)
AFAIK, это длинная линия говорит что my main.obj относится к функции, к которой привязан символ sm_eventTable @ wxApp @@ 1UwxEventTable @@ B, но что компоновщик не смог найти этот символ в (длинном) списке библиотек, которые я предоставил в командной строке ,
Я скомпилирую в/MD режиме. Не знаю, помогает ли это, болит или не имеет значения здесь.
Один из файлов связать с wxmsw31u_core.lib это и делает
DUMPBIN/заголовки wxmsw31u_core.lib> here.txt
дает длинный файл containting следующий
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 : [email protected]@@[email protected]@B (protected: static struct wxEventTable const wxApp::sm_eventTable)
Type : data
Name type : name
Hint : 14083
Name : [email protected]@@[email protected]@B
От это я заключил, что wxmsw31u_core.lib это «библиотека импорта»: другими словами, это означает, что эта библиотека не содержит код, а просто ссылается на файл dll wxmsw310u_core_vc140_x64.dll, который фактически содержит код. ?
Последний wxmsw310u_core_vc140_x64.dll файл действительно упоминает sm_eventTable @ wxApp @@ 1UwxEventTable @@ B, как я проверил:
DUMPBIN/ЭКСПОРТ wxmsw310u_core_vc140_x64.dll> here2.txt
дал
14084 3703 0057F008 [email protected]@@[email protected]@B = [email protected]@@[email protected]@B (protected: static struct wxEventTable const wxApp::sm_eventTable)
Отмечу, что первое число равно подсказке предыдущего заголовка плюс один. Полагаю, это нормально?
Я нашел время, чтобы проверить DLL, как указано выше, но AFAIK, DLL не требуется в процессе компоновки (требуется, когда вы вызываете .exe, который производится).
В целом, похоже, что все есть, и оно должно быть связано, поэтому я затрудняюсь определить, что здесь не так.
Редактировать
я частично решить эту проблему путем составления себе в libary вместо того, чтобы использовать скомпилированные binaires для Windows, предоставляемые WxWidgets: теперь я могу скомпилировать свою программу, и все хорошо.
Ну, не все: первоначальный вопрос остается. У меня была ситуация, когда я пытался связать obj с lib, чтобы получить exe, obj ссылается на символ, чье искаженное имя присутствует в lib, компоновщик загружает obj и lib (подтвержденное использование/VERBOSE), однако компоновщик отказывается считать символ «разрешенным». Зачем?
Я создам новый вопрос, где я попрошу объяснения об условиях, которые необходимо решить.
Спасибо за ваш ответ. У моей командной строки действительно есть/MACHINE: X64 и/LIBPATH: «the-path-to-the-lib» (во всяком случае без lib компоновщик останавливается на более раннем этапе). – Arnaud
@Arnaud '/ LIBPATH' должен быть путь к каталогу, а не самому файлу библиотеки – Nikita
Да, это правильный путь – Arnaud