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