【问题标题】:Undefined Extern Reference in EclipseEclipse 中未定义的外部引用
【发布时间】:2014-08-18 07:44:45
【问题描述】:

我正在尝试在 Eclipse 中编译一些在 Visual Studio 中可以正常编译的简单 c++ 代码。

我有以下文件(为清楚起见已重命名和简化)。 Main.cpp 中还有其他用于 main 函数等的样板代码,我已经省略了。

Foo.h

#ifndef FOO_H
#define FOO_H
extern Int foo;
#endif

Foo.cpp

Int foo = 0;

Main.cpp

#include "Foo.h"
void bar() {
    foo = 1;
}

当我尝试在 Eclipse 中编译时,出现以下错误(省略了长路径)

Main.o: in function bar():jni/Main.cpp:25: error: undefined reference to 'foo'
collect2: ld returned 1 exit status

如果我将鼠标悬停在 Main.cpp 中的 foo 上,它会显示它的工具提示,如果我右键单击它并选择 Open Declaration,它会将我带到 Foo.cpp 并突出显示 foo 声明。所以它显然找到了它,但无法编译。

如果我将声明移到 Main.cpp,如下所示,那么它编译得很好。

Main.cpp

#include "Foo.h"
Int foo = 0;
void bar() {
    foo = 1;
}

因此,由于某种原因,当将声明放置在与实际引用它的文件不同的 cpp 文件中时,Eclipse 看不到该声明。为什么会这样,我该如何解决?不幸的是,将声明移至 Main.cpp 是不可能的,因为需要跨多个 cpp 文件访问 extern。

【问题讨论】:

    标签: android c++ eclipse visual-studio compiler-errors


    【解决方案1】:

    这个错误意味着 Foo.cpp 的内容没有被链接到可执行文件中(并且可能没有被编译)。

    【讨论】:

    • 所有三个文件都包含在 Eclipse 项目中,正如我之前提到的,如果我右键单击 Main.cpp 中的 foo 并选择 Open Declaration,Eclipse 会将我带到 Foo.cpp 并突出显示 foo 声明.我需要做些什么来确保正在编译和链接文件吗?
    • 尝试“清理项目”然后“构建项目”(当您在 C++ 包资源管理器中右键单击项目时,都在上下文菜单中)。然后查看控制台窗口 - 它是否显示两个 CPP 文件正在使用 g++ 编译?
    • (或者您可以在控制台窗口中发布输出吗?)
    • 看来你是对的。仔细检查控制台输出后,我发现没有提及其他 cpp 文件。只是 Main.cpp 文件。您让我更好地了解了 Google 的用途,我遇到了this post on SO,它解决了问题。感谢您的帮助。
    猜你喜欢
    • 2013-10-17
    • 2014-03-28
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多