如何解决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 文件是一种解决方法,也请不要那样做!

你有两种可以接受的方式。

  1. 在包含文件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
    
  2. pid.cpp 文件添加到项目的源文件列表中。

    这部分实际上取决于您的构建工具。但是你的截图显示你已经编译了 app.cppmain.cpp。您只需以同样的方式处理 pid.cpp


对于模板,推荐的方式是将所有的实现放在包含文件中。不这样做需要始终如一地明确地实例化模板以供将来使用,这在通用库中不是一个选项。