Общая техника устранения неисправностей для неопределенных символов - gcc - PullRequest
13 голосов
/ 11 марта 2011

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

1 Ответ

25 голосов
/ 11 марта 2011

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

/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

Затем я используюth 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, чтобы сгенерировать файл, и проверяю файл впоследствии.Когда есть символ, я продолжаю собирать библиотеку или исполняемый файл, в который помещается этот файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...