zl程序教程

您现在的位置是:首页 >  其他

当前栏目

undefinedreferenceto`SetPduPowerConsumptionCnt'错误的解决方法

错误方法 解决
2023-06-13 09:15:03 时间

问题:
程序模型用C++语言编写,在程序模型和调用函数之间添加了一个接口文件modelc.cpp,用来让用c语言程序调用程序模型中的函数;

新添加了两个函数setPduPowerConsumptionCnt()和setPduPowerConsumptionTot(),用来清除PDU模型中的总功耗和功耗计数器;

编译时出现错误提示:

复制代码代码如下:

dingq@wd-u1110:~/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket$makeclean;make
rm-f*.opdu
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cmain.cpp-omain.o
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cmodel.cpp-omodel.o
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cmodelc.cpp-omodelc.o
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cIniFile.cpp-oIniFile.o
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cClientSocket.cpp-oClientSocket.o
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cThread.cpp-oThread.o
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cSensorReader.cpp-oSensorReader.o
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cLcdWriter.cpp-oLcdWriter.o
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cMonitor.cpp-oMonitor.o
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cHelper.cpp-oHelper.o
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cMutex.cpp-oMutex.o
arm-linux-g++-g3-Wall-o0-I../../../tools/eldk42/arm/usr/include/-I../../../tools/eldk42/arm/usr/include/C++/4.2.2/-cserial.cpp-oserial.o
arm-linux-gcc-g3-Wall-o0-cfrm_package.c-ofrm_package.o
arm-linux-gcc-g3-Wall-o0-cnettrans.c-onettrans.o
arm-linux-gcc-g3-Wall-o0-csensor-att7053.c-osensor-att7053.o
arm-linux-g++-L../../../tools/lib/-lpthread-opdumain.omodel.omodelc.oIniFile.oClientSocket.oThread.oSensorReader.oLcdWriter.oMonitor.oHelper.oMutex.oserial.ofrm_package.onettrans.osensor-att7053.o
sensor-att7053.o:Infunction`reset_EnergyPort":
/home/dingq/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket/sensor-att7053.c:83:undefinedreferenceto`SetPduPowerConsumptionCnt"
/home/dingq/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket/sensor-att7053.c:92:undefinedreferenceto`SetPduPowerConsumptionTot"
collect2:ldreturned1exitstatus
make:***[pdu]Error1

解决办法:
1.忘了在modelc.cpp的函数实现中添加extern"C"了。
复制代码代码如下:

extern"C"intsetPduPowerConsumptionCnt(intindex,unsignedintval){
 if(index>8||index<1){
  printf("Error:Theindexavailableisbetween1and8.\n");
  return-1;
 }
 model->Channels()[index-1].TheEnergyPort().SetPowerConsumptionCount(val);

 return0;
}


添加之后,再次编译,错误仍然存在。
查找了半天,原来头文件modelc.h中和实现文件modelc.cpp中的函数名差了一个符号,头文件中是小写的s,setPduPowerConsumptionCnt,而实现文件中用了大写的S,SetPduPowerConsumptionCnt;而使用vim编辑器时,没有设定区分大小写,导致没有很容易一眼看出来。

修改之后,成功编译。
问题解决。