当前位置: 首页 > 面试题库 >

未定义对函数的引用

裴学
2023-03-14
问题内容

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

问题答案:

如果您确实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();

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



 类似资料:
  • 我终于绝望了。所以,在我的c课上,我们被指示使用类。我们会让头文件声明类和函数,而另一个单独的. cpp文件实现它。事情应该是有效的,但他们没有,网上没有解决方案似乎对我有用。为此,我在linux上使用了G编译器,它似乎在IDE或普通命令行上都无法工作。 我在笔记本上看到的错误。h是这样的: 我有点不喜欢该文件没有接收任何电话类的方法。下面是TBook的代码。h: 这就是TBook.cpp的样子:

  • 我正在尝试使用AassetManager从android apk访问资产。然而,尽管我已经包含了asset_manager.h和asset_manager_jni.h,但我仍然得到了“对aassetmanager_fromjava的未定义引用”。其他来自asset_manager.h的函数,如AAssetManager_openDir(mgr,"“)等也不能被引用。 以下是完整的代码 这段代码在一

  • 错误:未定义对'pthread_cancel'的引用

  • 我得到一个 据我所知,构造函数是被定义的,但是编译器显然看不到它。我唯一的结论是存在某种包含问题(例如,循环包含)。 我已经为下面的每个翻译单元制作了一个包含图,但是我看不出有任何问题。任何指导都将不胜感激。 包括:

  • 我有3个类,native-lib.cpp、tracker.cpp和tracker.hpp,但是,在构建过程中,如果我在navive-lib.cpp中使用tracker.cpp中的isTracking函数,我会得到一个错误。 > 错误:任务“:app:ExternalNativeBuildDebug”执行失败。 生成命令失败。执行进程/home/user/android/sdk/cmake/3.6.