c - "undefined reference to"C header 中的一个函数,但不是另一个函数

标签 c eclipse linker header

我正在尝试运行两个单独的函数,在同一 header 中定义:

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,这意味着该函数要么未在 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/

相关文章:

java - 如何显示两个对象列表之间的唯一元素?

java - 无根测试

c++ - 如何使用 g++ 在另一个文件中定义的函数?

c - 在 C 中用 x/y 坐标索引二维数组的约定是什么?

C/String 数据从文件到数组。分段故障

c++ - 通过下标 : legal by the C++ Standard or not? 获取一个过去的数组元素的地址

java - Eclipse - 方法建议问题

cuda - 您如何将用 C 编写的自定义 CUDA 内核链接到 Rust 项目?

c++ - 跨库的模板函数特化符号匹配

c - 如何动态地从数组中获取单元格值? [C89]