我正在使用Linux,并且具有以下文件:
main.c, main.h fileA.c, fileA.h fileB.cpp, fileB.h
该函数F1()在中声明fileB.h和定义fileB.cpp。我需要在中使用该函数fileA.c,因此我将该函数声明为
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
如果您确实fileA.c是使用C而不是C ++进行编译,则需要确保该函数具有正确的C兼容链接。
您可以使用extern关键字的特殊情况来执行此操作。在声明和定义时:
extern
extern "C" void F1(); extern "C" void F1() {}
否则,C链接器将寻找一个仅存在某些错误的C ++名称和不受支持的调用约定的函数。:)
不幸的是,尽管这是您在C 中必须要做的,但语法在C中无效。您必须extern仅对C 代码可见。
因此,使用一些预处理器魔术:
#ifdef __cplusplus extern "C" #endif void F1();
不完全美观,但这是您在两种语言的代码之间共享标头所要付出的代价。