在C ++项目中,我尝试调用此函数,该函数在C中定义:
int CyBtldr_RunAction(CyBtldr_Action action, const char* file, const uint8_t* securityKey,
uint8_t appId, CyBtldr_CommunicationsData* comm, CyBtldr_ProgressUpdate* update);
CyBtldr_ProgressUpdate也在C中定义为:
typedef void CyBtldr_ProgressUpdate(uint8_t arrayId, uint16_t rowNum);
我收到以下未定义的引用错误。我错过了什么吗?
.\bootloader.cpp:88: error: undefined reference to 'CyBtldr_RunAction(CyBtldr_Action, char const*, unsigned char const*, unsigned char, CyBtldr_CommunicationsData*, void (*)(unsigned char, unsigned short))'
答案 0 :(得分:4)
你需要
extern "C"
因为c ++函数名在编译时被更改。这是允许在c ++中重载函数和方法的原因。
您可以使用它来包装像这样的函数声明
extern "C" {
int CyBtldr_RunAction(CyBtldr_Action action, const char* file, const uint8_t* securityKey, uint8_t appId, CyBtldr_CommunicationsData* comm, CyBtldr_ProgressUpdate* update);
}
或者包含声明它的文件,例如
extern "C" {
#include "cybtldr_runaction_header.h";
}
有更多解释,read this documentation。
答案 1 :(得分:0)
int CyBtldr_RunAction(CyBtldr_Action action, const char* file, const uint8_t* securityKey,
uint8_t appId, CyBtldr_CommunicationsData* comm, CyBtldr_ProgressUpdate* update);
这是一个声明,而不是一个定义。声明意味着您可以调用该函数,但它仍然需要在某处(在某些编译单元或库中)进行定义,并且执行此操作将为您提供链接时“未定义引用”错误,如您所见。所以你需要在某个地方定义这个函数,你需要链接它。
此
typedef void CyBtldr_ProgressUpdate(uint8_t arrayId, uint16_t rowNum);
是一个类型声明,与CyBtldr_RunAction
无关,除了用作其中一个参数的类型。