2016-11-04 3 views
2

Я пытаюсь понять, почему я получаю undefined reference ошибки во время связывания:найти причину ошибки `неопределенной reference`

/home/amirgon/projects/esp8266/esp-open-sdk/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc -L/home/amirgon/projects/esp8266/esp-open-sdk/sdk/lib -T/home/amirgon/projects/esp8266/esp-open-sdk/sdk/ld/eagle.app.v6.cpp.ld -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static -Wl,--start-group -lc -lgcc -lhal -lphy -lpp -lnet80211 -llwip -lwpa -lmain build/app_app.a -Wl,--end-group -o build/app.out 
build/app_app.a(routines.o):(.text+0x4): undefined reference to `pvPortMalloc(unsigned int, char const*, int)' 

GCC жалуется, что не может найти функцию pvPortMalloc.
Однако, Я могу подтвердить эту функцию в libmain.a!

В командной строке выше ссылка на libmain ссылается на -lmain, а путь к библиотеке - -L/home/amirgon/projects/esp8266/esp-open-sdk/sdk/lib. Когда я дамп символов из libmain.a на этом пути я могу найти pvPortMalloc помечена как T, что означает, что символ находится в разделе текста (кода):

/home/amirgon/projects/esp8266/esp-open-sdk/xtensa-lx106-elf/bin/xtensa-lx106-elf-nm -g /home/amirgon/projects/esp8266/esp-open-sdk/sdk/lib/libmain.a | grep pvPortMalloc 
     U pvPortMalloc 
0000014c T pvPortMalloc 
     U pvPortMalloc 

Так, я что-то пропустил? Что может быть причиной того, что gcc не находит функцию, хотя она существует в libmain.a?
Как я могу отладить эту ошибку?

+0

Нужно получить ваши библиотеки после ваших файлов .o на линии ссылок, я полагаю. Заказ имеет важное значение при связывании. –

+0

@FredLarson Не было бы исправлено '--start-group' /' -end-group'?он должен разрешать символы итеративно, пока не будут разрешены все символы. –

+0

Я думаю, что работает только для файлов .a, а не для файлов .o. –

ответ

3

Смешивание кода C++ и C вызывает вашу проблему.

Эта ошибка:

undefined reference to `pvPortMalloc(unsigned int, char const*, int)' 

Не сказать, что символ pvPortMalloc не может быть найден. В нем указано, что символ pvPortMalloc(unsigned int, char const*, int) не найден, и это символ C++.

Это означает, что где-то вы компилируете код на C++, который считает, что существует функция C++ pvPortMalloc, символ которой также включает в себя ее подпись, но у вас есть только функция pvPortMalloc C.

Вероятно, ваш код C++ является в том числе заголовочный файл, который не является C++ чистым, и вам нужно будет сделать что-то вроде этого:

extern "C" { 
#include "some_header.h" 
} 

Где some_header.h это заголовочный файл, объявляя функцию pvPortMalloc.

+0

В этом была проблема. Благодаря! –

1

Важным является не только порядок объектных файлов и библиотек в командной строке, но и порядок объектных файлов в пределах библиотеки.

Все, что решает ссылка должна прийти после используется символ, в противном случае вы можете получить странные проблемы связывания.

Эффект вы видите это типичная проблема библиотеки, которая была построена с ar и порядок объектных файлов неправильно (некоторые .o файл, используя внешнюю функцию, которая определена в некоторых .o файл перед тем тот, что использует этот символ в lib).

ranlib <libfile> - это инструмент, который исправляет это, создавая индекс для всех объектов в библиотеке и должен избавиться от этой проблемы.

+0

Это хороший совет, но проблема не в этом. Проблема заключалась в смешении кода C и C++. –

Смежные вопросы