我正在使用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'的引用
我得到一个 据我所知,构造函数是被定义的,但是编译器显然看不到它。我唯一的结论是存在某种包含问题(例如,循环包含)。 我已经为下面的每个翻译单元制作了一个包含图,但是我看不出有任何问题。任何指导都将不胜感激。 包括:
非常感谢你的帮助,noctilux
我有3个类,native-lib.cpp、tracker.cpp和tracker.hpp,但是,在构建过程中,如果我在navive-lib.cpp中使用tracker.cpp中的isTracking函数,我会得到一个错误。 > 错误:任务“:app:ExternalNativeBuildDebug”执行失败。 生成命令失败。执行进程/home/user/android/sdk/cmake/3.6.