Мне просто интересно, есть ли эффективная техника для устранения неполадок с неопределенными символами в gcc. Иногда один из моих проектов не связывается, и я обычно трачу много времени на поиски причины. Обычно это опечатка в глубоко скрытом make-файле, неверная переменная окружения или что-то в этом роде. Какой метод вы используете, если ваша сборка внезапно умирает с «неопределенным символом» и непонятно почему?

15
danatel 11 Мар 2011 в 09:50
Ищу в словаре слово "символ"... (извините, поздно...)
 – 
dappawit
11 Мар 2011 в 09:57

1 ответ

Скажем, это моя начальная конфигурация:

/usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
bar.o: In function `baz()':
bar.cpp:(.text+0xd): undefined reference to `Foo::bar()'
collect2: ld returned 1 exit status

Я начинаю с поиска отсутствующего символа с помощью grep во всех файлах .o и .lib.

$ grep 'Foo.*bar' *.o *.lib *.so
Binary file bar.o matches
Binary file foo.o matches

Затем я использую инструмент nm для проверки каждого объектного файла на предмет отсутствия или реализации символа.

$ nm foo.o
00000000 T _ZN3Foo3barEv

$ nm bar.o
00000000 T _Z3bazv
         U _ZN3Foo3barEv
         U __gxx_personality_v0

Теперь я знаю, что Foo::bar() реализован в foo.o и может связать этот файл с исполняемым файлом. Итак, следующая часть — выяснить, почему foo.o не включен в команду link.

Иногда вы не найдете никакого реализующего символа. Обычно это происходит, когда модуль реализации не построен или не включает символ (#ifdef, видимость символа). В таком случае я ищу файл .cpp, в котором определен символ, запускаю make $file.o для создания файла и затем проверяю файл. Когда smbol есть, я продолжаю собирать библиотеку или исполняемый файл, в который помещается этот файл.

27
Rudi 11 Мар 2011 в 11:16
Спасибо за вашу информацию. Также полезно добавить опцию -Wl-t для дампа библиотек, известных компоновщику. Вы знаете что-нибудь для действительно сложных случаев? Например, две зависимые статические библиотеки включены в неправильном порядке?
 – 
danatel
13 Мар 2011 в 13:00
Извините, но у меня нет общего метода отладки неправильных зависимостей библиотек, так как каждый случай индивидуален.
 – 
Rudi
14 Мар 2011 в 22:06
Это отличный ответ. Интересно, почему его не приняли.
 – 
Jon Mills
21 Май 2011 в 21:40