未定义引用一个函数

我正在使用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' 

哪里不对?

谢谢。

ETA:感谢我收到的答案,我现在有以下几点:

在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 

如果你真的把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(); 

不完全漂亮,但这是您在两种语言的代码之间共享标题所付出的代价。

为了能够从c源代码调用c ++函数,您需要提供适当的linkage specification

指定链接规范的格式是

 extern "type_of_Linkage" <function_name> 

所以在你的情况下,你应该使用:

 extern "C" void F1(); 

也许,使用

 extern "C" void F1(); 

fileA.c不能包含fileB.h(通过fileA.h),因为C编译器不知道extern“C”是什么意思,所以它抱怨它在一个字符串之前看到一个标识符。 不要试图将fileB.h包含在fileA.c或fileA.h中。 它不需要

我相信fileA.c还需要包含fileA.h。