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

3
在一个 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
我不知道我们如何在这么少的信息下帮助你。 - R Sahu
至少,您需要展示您认为该函数被定义的位置,它在哪里被调用以及您用于将这两个源代码链接在一起的命令行。您还应该确定您是在使用C还是C ++。我们能够帮助您的最好方法可能是指向未定义引用。(如果我没有投票得太快而导致不清楚您正在询问什么,我会将其关闭为重复问题)。 - Jonathan Leffler
我不想发布整个项目。能否告诉我是什么原因导致了这个错误?我知道的两个可能原因是调用与原型不匹配或找不到函数,但我认为这两个都不是罪魁祸首(可能我错了)。 - kjgregory
它是用C语言编写的,我正在从C++中调用它。我可以这样做吗? - kjgregory
2个回答

14
您需要
extern "C"
因为C++函数名在编译时会被更改,这就是允许C++函数和方法重载的原因。
您可以将其用于类似以下方式的函数声明包装:
```html

因为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";
}

如需更详细的解释和更多信息,请阅读此文档


这听起来很有可能成功。我明天会试一下,并重新改写问题,使其对他人更有用。 - kjgregory

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 没有任何关系,除了被用作其参数之一的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接