为什么将类的定义和它的成员函数的实现分别放在.h和.cpp中就会报错:
LNK2019: 无法解析的外部符号 "public: void __cdecl YtPlc_Mitsubishi_Mc::InitParam(void)" (?InitParam@YtPlc_Mitsubishi_Mc@@QEAAXXZ),该符号在函数 main 中被引用 PLC_test D:\zhoujy\prj\PLC_test\PLC_test\PLC_test.obj

.h中的代码如下:

class YtPlc_Mitsubishi_Mc  // : public YtPlc
{
public:
   YtPlc_Mitsubishi_Mc();

   //初始化参数
   void InitParam();
};

.cpp中的实现如下:

#include "ytplc_mitsubishi_mc.h"

YtPlc_Mitsubishi_Mc::YtPlc_Mitsubishi_Mc()
{

}

void YtPlc_Mitsubishi_Mc::InitParam()
{
   //发送命令
   write_buff_[0] = 0x50; // 副头部
   write_buff_[1] = 0x00; // 副头部
   write_buff_[2] = 0x00; // 网络编号
   write_buff_[3] = (char)0xff; // 可编程控制器编号
   write_buff_[4] = (char)0xff; // 请求目标模块I/O编号L
   write_buff_[5] = 0x03; // 请求目标模块I/O编号H
   write_buff_[6] = 0x00; // 请求目标模块站号

   // 长度从CPU监视定时器L到指令结束
   write_buff_[7] = 0x00; //请求数据长度L
   write_buff_[8] = 0x00; //请求数据长度H

   //CPU 监视定时器 0:无限等待 0001~FFFF H (1~65535): 等待时间(单位 250ms) @《三菱Q_L系列通信协议参考》3.1.3 P73
   write_buff_[9] = 0x01;  // CPU监视定时器L
   write_buff_[10] = 0x00; // CPU监视定时器H

   // 指令1401 @《三菱Q_L系列通信协议参考》3.3.7 P154
   write_buff_[11] = 0x01; // 指令L
   write_buff_[12] = 0x14; // 指令H
   write_buff_[13] = 0x00; // 子指令L
   write_buff_[14] = 0x00; // 子指令H

   // 字单位的批量写入
   write_buff_[15] = 0x00; // 起始软元件
   write_buff_[16] = 0x00; // 起始软元件
   write_buff_[17] = 0x00; // 起始软元件
   write_buff_[18] = 0x00; // 软元件代码
   write_buff_[19] = 0x00; // 软元件点数
   write_buff_[20] = 0x00; // 软元件点数

   // 软元件点数的范围
   // e.g 1995H 1202H 1130H -> {95H 19H 02H 12H 30H 12H}
   for (int i = 0; i < 20; i++)
   {
       write_buff_[21 + i * 2] = 0x00;
       write_buff_[21 + i * 2 + 1] = 0x00;
   }

   //读取命令
   read_buff_[0] = 0x50; // 副头部
   read_buff_[1] = 0x00; // 副头部
   read_buff_[2] = 0x00; // 网络编号
   read_buff_[3] = (char)0xff; // 可编程控制器编号
   read_buff_[4] = (char)0xff; // 请求目标模块I/O编号L
   read_buff_[5] = 0x03; // 请求目标模块I/O编号H
   read_buff_[6] = 0x00; // 请求目标模块站号

   read_buff_[7] = 0x0c; //请求数据长度L
   read_buff_[8] = 0x00; //请求数据长度H

   //CPU 监视定时器 0:无限等待 0001~FFFF H (1~65535): 等待时间(单位 250ms) @《三菱Q_L系列通信协议参考》3.1.3 P73
   read_buff_[9] = 0x01;  // CPU监视定时器L
   read_buff_[10] = 0x00; // CPU监视定时器H

   // 0401  T寄存器读取 @《三菱Q_L系列通信协议参考》3.3.6 P150
   // WARNING: M寄存器读取 send_buff_[18] = 0x90 待确认
   read_buff_[11] = 0x01; // 指令L
   read_buff_[12] = 0x04; // 指令H
   read_buff_[13] = 0x00; // 子指令L
   read_buff_[14] = 0x00; // 子指令H

   // 字单位的批量写入
   read_buff_[15] = 0x00; // 起始软元件
   read_buff_[16] = 0x00; // 起始软元件
   read_buff_[17] = 0x00; // 起始软元件
   read_buff_[18] = 0x00; // 软元件代码
   read_buff_[19] = 0x00; // 软元件点数
   read_buff_[20] = 0x00; // 软元件点数
}

但如果把它们都放到头文件中,即把成员函数和构造函数的实现和类的定义放到一起,就不会有这个问题了


  • vicky    2020-01-20 13:56:30
  • 阅读 836    收藏 0    回答 1
  • 邀请
  • 收藏
  • 分享
发送
登录 后发表评论
  • 51testing软件测试圈微信