一尘不染

未定义对函数的引用

linux

我正在使用Linux,并且具有以下文件:

main.c, main.h
fileA.c, fileA.h
fileB.cpp, fileB.h

该函数F1()在中声明fileB.h和定义fileB.cpp。我需要在中使用该函数fileA.c,因此我将该函数声明为

extern void F1();

fileA.c

但是,在编译过程中,我得到了错误

fileA.c: (.text+0x2b7): undefined reference to `F1'

怎么了?

谢谢。

预计到达时间:多亏了我收到的答案,我现在有了以下内容:

在fileA.h中,我有

#include fileB.h
#include main.h

#ifdef __cplusplus
extern "C" 
#endif
void F1();

在fileA.c中,我有

#include fileA.h

在fileB.h中,我有

extern "C" void F1();

在fileB.cpp中,我有

#include "fileB.h"

extern "C" void F1()
{ }

但是,我现在有错误

fileB.h: error: expected identifier or '(' before string constant

阅读 738

收藏
2020-06-07

共1个答案

一尘不染

如果您确实fileA.c是使用C而不是C ++进行编译,则需要确保该函数具有正确的C兼容链接。

您可以使用extern关键字的特殊情况来执行此操作。在声明和定义时:

extern "C" void F1();
extern "C" void F1() {}

否则,C链接器将寻找一个仅存在某些错误的C ++名称和不受支持的调用约定的函数。:)

不幸的是,尽管这是您在C 中必须要做的,但语法在C中无效。您必须extern仅对C
代码可见。

因此,使用一些预处理器魔术:

#ifdef __cplusplus
extern "C"
#endif
void F1();

不完全美观,但这是您在两种语言的代码之间共享标头所要付出的代价。

2020-06-07