混合 C 和 C++... 未定义的函数引用

kjg*_*ory 1 c c++ undefined-reference

在一个 C++ 项目中,我试图调用这个在 C 中定义的函数:

int CyBtldr_RunAction(CyBtldr_Action action, const char* file, const uint8_t* securityKey, 
    uint8_t appId, CyBtldr_CommunicationsData* comm, CyBtldr_ProgressUpdate* update);
Run Code Online (Sandbox Code Playgroud)

CyBtldr_ProgressUpdate 也在 C 中定义为:

typedef void CyBtldr_ProgressUpdate(uint8_t arrayId, uint16_t rowNum);
Run Code Online (Sandbox Code Playgroud)

我收到以下未定义的参考错误。我错过了什么吗?

.\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))'
Run Code Online (Sandbox Code Playgroud)

Iha*_*imi 8

你需要

extern "C"
Run Code Online (Sandbox Code Playgroud)

因为 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);
}
Run Code Online (Sandbox Code Playgroud)

或者包含声明它的文件,比如

extern "C" {
#include "cybtldr_runaction_header.h";
}
Run Code Online (Sandbox Code Playgroud)

有关扩展说明和更多信息,请阅读此文档