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

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


person tsellon    schedule 29.08.2008    source источник


Ответы (3)


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

Ниже приведена ошибка компоновщика из 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)» — это символ, который не удалось найти, в данном случае это функция с именем Does_not_exist().

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

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


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

person Joe Schneider    schedule 03.09.2008
comment
Ну, а если я найду место реализации метода и не вижу в этом ничего плохого, что мне делать дальше? Есть ли способ получить список связанных файлов? Ваш ответ, безусловно, хорош для начинающих, но это лучший результат для отладки компоновщика, и есть другие возможные причины, кроме опечатки в имени функции. - person Tomáš Zato - Reinstate Monica; 26.10.2015

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

Есть ли неудача, которую вы имеете в виду?

person Nathan Fellman    schedule 29.08.2008

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

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

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

person Rob Walker    schedule 29.08.2008