2017-01-19 9 views
0

Я пытаюсь запустить два отдельных функций, определенных в том же заголовке:«неопределенная ссылка на» одной функции в заголовке C, но не другой

void MIC3_WriteByte(PmodMIC3* InstancePtr, u8 cmd); 
void MIC3_ReadSPI(PmodMIC3* InstancePtr, u8 reg, u8 *rData, int nData); 

Когда я называю их так же, как это, WriteByte работы просто

выполнить точную
MIC3_WriteByte(&microphone, byte); 
MIC3_ReadSPI(&microphone, reg, byteArray, ndata); 

Но ReadSPI дает мне ошибку, когда я запускаю линкер:

main.c:84: undefined reference to `MIC3_ReadSPI' 

Если я помню мой C правильно Это означает, что функция либо не определена в заголовке, либо неправильно связана. Но если это так, почему функция работает только в работе заголовка, а не в другом?

Более смешения, если я намеренно malform вход в ReadSPI (скажем лишь придав ему 3 входа), я получаю другое сообщение об ошибке -

../src/main.c:84:5: error: too few arguments to function 'MIC3_ReadSPI' 

Как он может знать, сколько аргументов функция должна иметь , но не в том, что функция должна существовать? Это какой-то артефакт, возникающий из-за первой ошибки, которую бросает компоновщик, и второй ошибки, сгенерированной компилятором?

+3

«функция либо не определена в заголовке, либо неправильно связана». Это последнее. Вам необходимо описать файлы, в которых определены функции, а также точную ссылку. – kaylum

+2

Число аргументов определяется компилятором путем чтения заголовка функции (определенного в файле заголовка, который вы успешно включили в исходный код). Реализация функции хранится в библиотеке, которую вы не смогли связать с компиляцией _after_. Заголовок функции и реализация функции должны совпадать, но они представляют собой два разных объекта. – DyZ

ответ

0

Следующая декларация в файле заголовка является прототип функции, которая описывает тип возвращаемого значения, имя функции, количество и типы параметров:

void MIC3_ReadSPI(PmodMIC3* InstancePtr, u8 reg, u8 *rData, int nData); 

Так что, если вы ссылаетесь эту функцию в исходном файле C, включая заголовочный файл, вы создадите ошибку при компиляции файла C, если вы не соответствуете этому описанию. Это объясняет вашу ошибку too few arguments.

Кроме того, если эта функция не является в вашем проекте (определение функции соответствует блоку кода для запуска при вызове функции), вы будете вызывать ошибку при связывании своего проекта, потому что компоновщик должен знать определение от всего, на что вы ссылаетесь. Это объясняет вашу ошибку undefined reference.

Заключение: возможно, ваша функция MIC3_WriteByte четко определена в вашем проекте, что не относится к MIC3_ReadSPI.