C++ 对函数的未定义引用

C++ 对函数的未定义引用,c++,c,linux,undefined-reference,C++,C,Linux,Undefined Reference,我正在使用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' 怎么了 多谢各位 埃塔:感谢我收到的答案

我正在使用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();
extern "C" void F1();
在fileA.c中,我有

#include fileA.h
在文件B.h中,我有

#include fileB.h
#include main.h

#ifdef __cplusplus
extern "C" 
#endif
void F1();
extern "C" void F1();
在fileB.cpp中,我有

#include "fileB.h"

extern "C" void F1()
{ }
然而,我现在有一个错误

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

我认为fileA.c还需要包含fileA.h。

也许,使用

extern "C" void F1();

< >从C源代码调用C++函数,你需要给出相应的<代码>链接规范< /C>。p> 指定连杆规格的格式为

extern "type_of_Linkage" <function_name>

<>如果你真的编译<代码> FILE.C./COD>作为C,而不是C++,那么你需要确保函数具有适当的,C兼容的链接。 您可以使用
extern
关键字的特殊情况来实现这一点。在声明和定义中:

extern "C" void F1();
extern "C" void F1() {}
< C >否则,C链接器将只查找一个函数,该函数仅存在于一些已被损坏的C++名称中,而不支持的调用约定。p> 不幸的是,这是你必须在C++中做的事情。你必须使 ExtNeX/Cuff>只对C++代码可见。< /P> 因此,使用一些预处理器魔法:

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

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

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

所以现在我有了外部“C”void F1();和分别位于我的fileB.h和fileB.cpp中的extern“C”void F1(){},以及extern“C”void F1();在文件A.c。但在编译过程中,我得到了错误“fileB.h:error:expected identifier or”(“字符串常量之前”),“fileA.c:error:expected identifier or”(“字符串常量之前”),以及“fileA.c:warning:implicit declaration of function“F1”。”@Tomalak:我仍然有一些错误。请查看我对原始条目的编辑。@Rayne:它是
\uuuuCPlusplus
,而不是
\uuuuCPluplus
。问题是:您的C可以看到函数声明两次。一次是从标题处(您没有使用宏的地方:这是您应该做的地方,因为这是语言之间共享的代码),还有一个来自
fileA.c
,您根本不应该在这里编写声明。@Tomalak:我已经做了更改(请参见原始条目中的编辑),但仍然得到了“预期标识符”错误。我不再有“隐式声明”错误。@Rayne:为什么
fileB.h
声明头?您的C代码仍然可以看到一行
extern“C”
。想想什么包含go where。你应该在一个标头中声明函数,并在一个源文件中定义它。标头可以包含在许多地方,包括(由于我们的宏技巧)在C源文件中。包含失败会在编译时导致声明错误,而不是在链接时导致定义错误。