Подтвердить что ты не робот

Рекомендации по отладке ошибок связывания

При создании проектов на С++ я обнаружил, что ошибки отладки ссылок сложны, особенно когда вы выбираете код других людей. Какие стратегии используют люди для отладки и исправления ошибок привязки?

4b9b3361

Ответ 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. Ошибка, с которой я столкнулся, - это когда у меня есть два набора файлов, скомпилированных в две отдельные библиотеки, и я перекрестно перехожу между библиотеками.

Есть ли у вас недостаток?