为什么将类的定义和它的成员函数的实现分别放在.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; // 软元件点数
}
但如果把它们都放到头文件中,即把成员函数和构造函数的实现和类的定义放到一起,就不会有这个问题了