如何解决main函数中未定义的引用?
How to solve undefined reference in main function?
下面是我的头文件,它声明了函数set_params
#ifndef PID_H
#define PID_H
class PID
{
float _kp,_ki,_kd,_error,_previous_error,_dt;
public:
void set_params(float kp, float ki, float kd,float error,float previous_error,float dt);
};
#endif
下面是我的pid.cpp,里面有函数定义。
#include "PID.h"
void PID::set_params(float kp, float ki, float kd,float error,float previous_error,float dt)
{
_kp = kp;
_ki = ki;
_kd = kd;
_error = error;
_previous_error = previous_error;
_dt = dt;
}
以下是我的main.cpp。我在 visual studio code
中使用 platformio
PID pid;
void setup() {
//
}
void loop()
{
pid.set_params(3.0,0.05,2.05,0.5,0.0,1.0);
}
我得到如下错误
它声明 set_params 是一个未定义的引用。
我通过点击这个标有红色的按钮来编译它,实际上我不知道如何单独编译j pid.cpp文件。如果有什么办法请给我一个link。
请告诉我哪里错了。
谢谢
在您发表评论后,即使包含 cpp 文件是一种解决方法,也请不要那样做!
你有两种可以接受的方式。
在包含文件class本身中定义方法
有些 IDE 默认情况下会创建一个仅包含方法声明的包含文件,并将定义放入实现 cpp 文件中。但标准允许定义在 class 定义内,它通常用于小方法或模板 (*)
所以你的 header 可能是:
#ifndef PID_H
#define PID_H
class PID
{
float _kp,_ki,_kd,_error,_previous_error,_dt;
public:
void set_params(float kp, float ki, float kd,float error,float previous_error,float dt) {
_kp = kp;
_ki = ki;
_kd = kd;
_error = error;
_previous_error = previous_error;
_dt = dt;
}
};
#endif
将 pid.cpp
文件添加到项目的源文件列表中。
这部分实际上取决于您的构建工具。但是你的截图显示你已经编译了 app.cpp
和 main.cpp
。您只需以同样的方式处理 pid.cpp
。
对于模板,推荐的方式是将所有的实现放在包含文件中。不这样做需要始终如一地明确地实例化模板以供将来使用,这在通用库中不是一个选项。
下面是我的头文件,它声明了函数set_params
#ifndef PID_H
#define PID_H
class PID
{
float _kp,_ki,_kd,_error,_previous_error,_dt;
public:
void set_params(float kp, float ki, float kd,float error,float previous_error,float dt);
};
#endif
下面是我的pid.cpp,里面有函数定义。
#include "PID.h"
void PID::set_params(float kp, float ki, float kd,float error,float previous_error,float dt)
{
_kp = kp;
_ki = ki;
_kd = kd;
_error = error;
_previous_error = previous_error;
_dt = dt;
}
以下是我的main.cpp。我在 visual studio code
中使用 platformioPID pid;
void setup() {
//
}
void loop()
{
pid.set_params(3.0,0.05,2.05,0.5,0.0,1.0);
}
我得到如下错误
在您发表评论后,即使包含 cpp 文件是一种解决方法,也请不要那样做!
你有两种可以接受的方式。
在包含文件class本身中定义方法
有些 IDE 默认情况下会创建一个仅包含方法声明的包含文件,并将定义放入实现 cpp 文件中。但标准允许定义在 class 定义内,它通常用于小方法或模板 (*)
所以你的 header 可能是:
#ifndef PID_H #define PID_H class PID { float _kp,_ki,_kd,_error,_previous_error,_dt; public: void set_params(float kp, float ki, float kd,float error,float previous_error,float dt) { _kp = kp; _ki = ki; _kd = kd; _error = error; _previous_error = previous_error; _dt = dt; } }; #endif
将
pid.cpp
文件添加到项目的源文件列表中。这部分实际上取决于您的构建工具。但是你的截图显示你已经编译了
app.cpp
和main.cpp
。您只需以同样的方式处理pid.cpp
。
对于模板,推荐的方式是将所有的实现放在包含文件中。不这样做需要始终如一地明确地实例化模板以供将来使用,这在通用库中不是一个选项。