我正在尝试运行两个单独的函数,在同一 header 中定义:
void MIC3_WriteByte(PmodMIC3* InstancePtr, u8 cmd);
void MIC3_ReadSPI(PmodMIC3* InstancePtr, u8 reg, u8 *rData, int nData);
当我像这样调用它们时,WriteByte 工作得很好 -
MIC3_WriteByte(µphone, byte);
MIC3_ReadSPI(µphone, reg, byteArray, ndata);
但是当我运行链接器时,ReadSPI 给出了一个错误:
main.c:84: undefined reference to `MIC3_ReadSPI'
如果我没记错我的 C,这意味着该函数要么未在 header 中定义,要么链接不正确。但如果是这样的话,为什么只在 header 中定义的一个函数起作用,而另一个则不起作用?
更令人困惑的是,如果我故意扭曲 ReadSPI 的输入(比如只给它 3 个输入),我会收到不同的错误消息 -
../src/main.c:84:5: error: too few arguments to function 'MIC3_ReadSPI'
它如何知道函数应该有多少个参数,但不知道函数应该存在?这是由链接器抛出的第一个错误和编译器抛出的第二个错误导致的某种工件吗?
最佳答案
头文件中下面的声明是函数原型(prototype),描述了返回值类型、函数名称、参数个数和类型:
void MIC3_ReadSPI(PmodMIC3* InstancePtr, u8 reg, u8 *rData, int nData);
因此,如果您在包含头文件的 C 源文件中引用此函数,并且不符合此描述,则在编译 C 文件时将会出现错误。这解释了您的参数太少
错误。
此外,如果您的项目中没有定义此函数(函数定义对应于调用函数时要运行的代码块),则在链接项目时会出现错误,因为链接器必须知道你所指的一切的定义。这解释了您的 undefined reference
错误。
结论:您的函数 MIC3_WriteByte
可能在您的项目中定义良好,但 MIC3_ReadSPI
的情况并非如此。
关于c - "undefined reference to"C header 中的一个函数,但不是另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41732940/