1

我在 codeVision AVR 中的 c 项目中添加了一个库。当我想使用它的函数时收到此错误:函数“函数名”已声明但从未定义。这是我的代码:

#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.h 中:

.
.
bool PID_Compute(PidType* pid);
.
.

和 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_Compute”已声明,但从未定义。

问题出在哪里?

编辑:

要将库添加到我的项目中,我将 .c 和 .h 库文件放在我的主项目文件所在的同一文件夹中:

在此处输入图像描述

然后 #include "pid.h" 在我的主文件中:

#include "pid.h"
#include <mega32.h>

// Declare your global variables here
PidType _pid;
void main(void)
{
.
.

我的错误和警告: 在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

EDIT2:我简化了代码,现在可以向您展示整个代码:主要代码:

#include "pid.h"
PidType _pid;
void main(void)
{
PID_Compute(&_pid);
while (1)
      {

      }
}

pid.h:

#ifndef PID_H
#define PID_H

#include <stdbool.h>

typedef struct {
 int i;
} PidType;


bool PID_Compute(PidType* pid);

#endif

pid.c:

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

    pid->i = 2;
    return true;
}
4

2 回答 2

1

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

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

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

于 2021-02-23T09:33:10.470 回答
1

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

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

于 2021-02-23T14:33:56.880 回答