混合 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 无关,只是用作其参数之一的类型。