При создании проектов на С++ я обнаружил, что ошибки отладки ссылок сложны, особенно когда вы выбираете код других людей. Какие стратегии используют люди для отладки и исправления ошибок привязки?
Рекомендации по отладке ошибок связывания
Ответ 1
Не уверен, каков ваш уровень знаний, но вот основы.
Ниже приведена ошибка компоновщика от VS 2005 - да, это гигантский беспорядок, если вы не знакомы с ним.
ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" ([email protected]@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" ([email protected]@[email protected]@[email protected])
Есть несколько моментов, на которые следует обратить внимание:
- "ByteComparator.obj" - найдите файл ByteComparator.cpp, это источник проблемы с компоновщиком.
- "int __cdecl does_not_exist (void)" - это символ, который он не мог найти, в этом случае функция с именем does_not_exist()
В этот момент во многих случаях самым быстрым способом разрешения является поиск базы кода для этой функции и поиск места реализации. Когда вы знаете, где функция реализована, вам просто нужно убедиться, что два места связаны друг с другом.
Если вы используете VS2005, вы должны использовать меню "Зависимости проектов...". Если вы используете gcc, вы бы посмотрели в своих файлах make для этапа создания исполняемого файла (gcc, вызванного с большим количеством файлов .o) и добавьте отсутствующий файл .o.
Во втором сценарии может отсутствовать "внешняя" зависимость, для которой у вас нет кода. Библиотеки Win32 часто применяются в статических библиотеках, к которым вы должны подключиться. В этом случае перейдите в MSDN или "Microsoft Google" и найдите API. В нижней части описания API дано имя библиотеки. Добавьте это в свойства вашего проекта. Свойства "Конфигурация" → "Linker- > Input- > Additional Dependencies". Например, функция timeGetTime() страница в MSDN говорит вам использовать Winmm.lib внизу страницы.
Ответ 2
Библиотеки времени исполнения C часто являются самым большим виновником. Убедившись, что все ваши проекты имеют одинаковые настройки по сравнению с многопоточными и статическими vs dll.
Документация MSDN хороша для указания того, какой lib требует конкретный вызов API Win32, если он появляется как отсутствующий.
Кроме того, обычно это сводится к включению вербального флага и прошиванию через выход, ищущий подсказки.
Ответ 3
Одна из распространенных ошибок связывания, с которой я столкнулся, - это когда функция используется иначе, чем она определена. Если вы видите такую ошибку, вы должны убедиться, что каждая используемая вами функция правильно объявлена в каком-либо файле .h.
Вы также должны убедиться, что все соответствующие исходные файлы скомпилированы в один и тот же файл lib. Ошибка, с которой я столкнулся, - это когда у меня есть два набора файлов, скомпилированных в две отдельные библиотеки, и я перекрестно перехожу между библиотеками.
Есть ли у вас недостаток?