#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. На этот раз я не создал библиотеку. Возможно, это то, что я должен сделать, я хотел избежать этой боли.