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