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

时间:2017-08-05 05:02:00

标签: 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);

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))'

2 个答案:

答案 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无关,除了用作其中一个参数的类型。