Существует ли автоматизированная программа для поиска ошибок компоновщика C ++? - PullRequest
0 голосов
/ 01 декабря 2009

Я работаю в среде Linux с C ++, используя компилятор GCC.

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

После запуска процесса сборки все компилируется без проблем, но возвращается с ужасной ошибкой компоновщика при попытке использовать вновь добавленную библиотеку пользовательского кода, которую мы создали. Теперь мы прошли через огромный объем кода с мелким гребенком, ища несоответствия правописания, проверили порядок включения всех библиотек в процесс сборки и проверили, что созданные .o файлы содержат то, что нам нужно, используя dumps, и все как и где они должны быть. Мы также протестировали библиотеку отдельно, и проблема определенно не в этом.

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

Существует ли инструмент для C ++, который может автоматически обнаруживать ошибки компоновщика, аналогично cppcheck или splint (оба из которых мы запустили безрезультатно), который мог бы здесь помочь?

Ответы [ 2 ]

4 голосов
/ 01 декабря 2009

Не знаю вашу платформу, но я провел некоторое время с проблемами компоновщика в gcc, пока не понял, что для статической связи (.a) требуется определенный порядок, для ссылки gcc object.o first.a second.a это не то же самое, что gcc object.o second.a first.a.

2 голосов
/ 01 декабря 2009

FWIW (не очень) Я пытаюсь решить эту проблему, используя другой компоновщик, поскольку у меня есть доступ к нескольким различным платформам. Если вы можете использовать другой компоновщик, вы найдете либо:

а) программа связывает, что превращает вашу проблему из «почему она не связывает?» на «чем отличаются линкеры от линковки?» это не совсем шаг вперед, но иногда шаг в сторону дает вам другую точку зрения, с которой вы можете увидеть решение;

OR

b) он не может связать, и в этом случае другой компоновщик может дать более полезную информацию о том, почему он не работает.

...