Мне просто интересно, есть ли эффективный метод устранения неполадок undefined символов в gcc. Иногда один из моих проектов не удается связать, и я обычно трачу много времени на поиск причин. Обычно это опечатка в глубоко скрытом make файле, неправильной переменной среды или что-то в этом роде. Какой метод вы используете, если ваша сборка внезапно умирает с символом undefined, и не понятно почему?
Общий метод устранения неполадок для символов undefined - gcc
Ответ 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 существует, я продолжаю создавать библиотеку или исполняемый файл, в который помещается этот файл.