混合 C 和 C++...未定义的函数引用
Mixing C and C++... undefined reference to function
在 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))'
你需要
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。
int CyBtldr_RunAction(CyBtldr_Action action, const char* file, const uint8_t* securityKey,
uint8_t appId, CyBtldr_CommunicationsData* comm, CyBtldr_ProgressUpdate* update);
这是声明,不是定义。声明意味着你可以调用函数,但它仍然需要在某处定义(在某些编译单元或库中),并且这样做会给你一个 link-time 'undefined reference' 错误,如你所见。所以你需要在某个地方定义这个函数,你需要 link 它。
这个
typedef void CyBtldr_ProgressUpdate(uint8_t arrayId, uint16_t rowNum);
是一个类型声明,与 CyBtldr_RunAction
无关,只是用作其参数之一的类型。
在 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))'
你需要
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。
int CyBtldr_RunAction(CyBtldr_Action action, const char* file, const uint8_t* securityKey,
uint8_t appId, CyBtldr_CommunicationsData* comm, CyBtldr_ProgressUpdate* update);
这是声明,不是定义。声明意味着你可以调用函数,但它仍然需要在某处定义(在某些编译单元或库中),并且这样做会给你一个 link-time 'undefined reference' 错误,如你所见。所以你需要在某个地方定义这个函数,你需要 link 它。
这个
typedef void CyBtldr_ProgressUpdate(uint8_t arrayId, uint16_t rowNum);
是一个类型声明,与 CyBtldr_RunAction
无关,只是用作其参数之一的类型。