Лучшие практики для отладки ошибок компоновки - PullRequest
36 голосов
/ 29 августа 2008

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

Ответы [ 3 ]

22 голосов
/ 03 сентября 2008

Не уверен, каков ваш уровень знаний, но вот основы.

Ниже приведена ошибка компоновщика из VS 2005 - да, это огромный беспорядок, если вы не знакомы с ним.

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" (?does_not_exist@@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" (?TextScan@@YAXAAUFileTextStats@@PBD1_N2_J@Z)

Есть пара моментов, на которых следует сосредоточиться:

  • "ByteComparator.obj" - найдите файл ByteComparator.cpp, это источник проблемы компоновщика
  • "int __cdecl does_not_exist (void)" - этот символ не может быть найден, в данном случае функция с именем did_not_exist ()

На этом этапе во многих случаях самый быстрый способ разрешения - это найти в базе кода эту функцию и найти, где находится реализация. Как только вы узнаете, где реализована функция, вам просто нужно убедиться, что эти два места связаны друг с другом.

Если вы используете VS2005, вы бы использовали контекстное меню «Зависимости проекта ...». Если вы используете gcc, вы должны посмотреть в своих make-файлах шаг генерации исполняемого файла (gcc вызывается с кучей файлов .o) и добавить отсутствующий файл .o.


Во втором сценарии у вас может отсутствовать «внешняя» зависимость, для которой у вас нет кода. Библиотеки Win32 часто реализуются в статических библиотеках, на которые вы должны ссылаться. В этом случае перейдите на MSDN или "Microsoft Google" и выполните поиск API. Внизу описания API указано имя библиотеки. Добавьте это в список свойств проекта «Свойства конфигурации-> Компоновщик-> Ввод-> Дополнительные зависимости». Например, страница timeGetTime () на MSDN говорит вам использовать Winmm.lib внизу страницы.

3 голосов
/ 29 августа 2008

Библиотеки C-runtime часто являются главными виновниками. Убедиться, что все ваши проекты имеют одинаковые настройки: одиночная или многопоточность, статическая - dll.

Документация MSDN хороша для указания того, какую библиотеку требует конкретный вызов Win32 API, если он появляется как отсутствующий.

Кроме того, обычно все сводится к включению подробного флага и пробирается через выход в поисках подсказок.

3 голосов
/ 29 августа 2008

Одна из распространенных ошибок компоновки, с которыми я столкнулся, - это когда функция используется не так, как она определена. Если вы видите такую ​​ошибку, вы должны убедиться, что каждая используемая вами функция правильно объявлена ​​в каком-то файле .h.
Вы также должны убедиться, что все соответствующие исходные файлы скомпилированы в один и тот же файл lib. Ошибка, с которой я столкнулся, - это когда два набора файлов скомпилированы в две отдельные библиотеки, и я выполняю перекрестный вызов между библиотеками.

Есть ли у вас какая-то ошибка?

...