C 已声明但从未定义的错误函数

C 已声明但从未定义的错误函数,c,avr,codevisionavr,C,Avr,Codevisionavr,我在codeVision AVR中为我的c项目添加了一个库。当我想使用它的函数时,会收到以下错误: 函数“function name”已声明但从未定义。 这是我的密码: #include "pid.h" #include <mega32.h> PidType _pid; void main(void) { //some uC hardware initializing codes which are removed here to simplify code PI

我在codeVision AVR中为我的c项目添加了一个库。当我想使用它的函数时,会收到以下错误: 函数“function name”已声明但从未定义。 这是我的密码:

#include "pid.h"
#include <mega32.h>
PidType _pid;
void main(void)
{
//some uC hardware initializing codes which are removed here to simplify code
PID_Compute(&_pid);
while (1)
  {
  // Place your code here

  }
}
和pid.c:


#include "pid.h"
.
.
bool PID_Compute(PidType* pid) {
  if (!pid->inAuto) {
    return false;
  }
    FloatType input = pid->myInput;
    FloatType error = pid->mySetpoint - input;
    pid->ITerm += (pid->ki * error);
    if (pid->ITerm > pid->outMax)
      pid->ITerm = pid->outMax;
    else if (pid->ITerm < pid->outMin)
      pid->ITerm = pid->outMin;
    FloatType dInput = (input - pid->lastInput);

    FloatType output = pid->kp * error + pid->ITerm - pid->kd * dInput;

    if (output > pid->outMax)
      output = pid->outMax;
    else if (output < pid->outMin)
      output = pid->outMin;
    pid->myOutput = output;


    pid->lastInput = input;
    return true;
}

pid.h:

#ifndef PID_H
#define PID_H

#include <stdbool.h>

typedef struct {
 int i;
} PidType;


bool PID_Compute(PidType* pid);

#endif

从文件树状视图的屏幕截图可以清楚地看出,文件“pid.c”不是项目的一部分

将其移动到您的项目中。然后它应该在没有链接器错误的情况下构建

这并不意味着文件系统中的位置。我在您的项目中引用了IDE的“虚拟”视图。

谢谢大家。 正如您所说,pid.c没有添加到项目中。 对于那些可能面临同样问题的人: 在codeVision AVR中,我们必须从项目->配置->文件->输入文件->添加将.c文件添加到项目中


我将c.c文件添加到project中,错误消失。

看起来
pid.c
未与主程序链接。可能您没有正确地将其添加到项目中(在全部重建/清除重建之后)完整地发布生成日志。它应该向您显示正在编译的内容和正在链接的内容。必须编译pid.c和
main()
中的任何文件,然后链接它们各自的对象文件。显然,pid.c不包括在内。你说你已经将它添加到了你的项目中,但没有说你是如何做到的。顺便说一句,这不是严格意义上的“库”,它只是一个模块或翻译单元;如果您将其作为库添加到项目中,这可能就是问题所在。“已声明但未定义”错误通常意味着您在文件中声明了静态函数,但从未实际定义过该函数。这通常不是链接器错误。链接器错误通常为“未定义引用”。您需要向我们展示一个MCVE(-或MRE或现在使用的任何名称)或一个SSCCE()-相同的想法使用不同的名称,您的代码是次最小的;我们无法编译它来重现您看到的错误。@JonathanLeffler我把一个MCVE“pid.c”放在与“pid.h”相同的位置。
#include "pid.h"
#include <mega32.h>

// Declare your global variables here
PidType _pid;
void main(void)
{
.
.
#include "pid.h"
PidType _pid;
void main(void)
{
PID_Compute(&_pid);
while (1)
      {

      }
}
#ifndef PID_H
#define PID_H

#include <stdbool.h>

typedef struct {
 int i;
} PidType;


bool PID_Compute(PidType* pid);

#endif
#include "pid.h"
bool PID_Compute(PidType* pid) {

    pid->i = 2;
    return true;
}