【发布时间】:2012-07-17 16:52:32
【问题描述】:
在尝试使用 C++ 在 Linux 中构建模块时,我遇到了一个严重的“未定义引用”错误。我将在高层次上描述它,并在必要时稍后发布代码(它是专有的,因此发布它需要更改名称)。一些细节:
- 模块 A(一个库)有一个类,我们将使用一个名为 Bar 的方法调用该类。模块 A 构建得很好,使用 nm 查看目标文件表明构造函数和 Bar 都已定义(它们显示为“T”)。
- 模块 B(一个库)包含一个使用模块 A 的类,其中引用了 Foo::Foo、Foo::~Foo 和 Foo::Bar。它的makefile 包括-L/path/to/Foo 和-lFoo。这个模块也构建得很好。但是,当我在模块 B 的目标文件上运行 nm 时,对模块 Foo::Foo、Foo::~Foo 和 Foo::Bar 的调用是未定义的(它们显示为“U”)。为什么它构建我无法理解。
-
模块 C - 其输出是可执行文件 - 包含对模块 B 的引用。当我尝试构建模块 C 时,然后它对我大喊大叫,因为从模块 B 到模块 A 的 Foo 和条形方法。
- 如果引用未定义,为什么要构建模块 B?
- 为什么只有进入模块 C 后才报告错误?
编辑:
- 我应该提一下,模块 C 的 makefile 也有 -L/path/to/Foo 和 -lFoo,但它仍然失败。关于我应该尝试的任何事情的任何高级猜测?我有一种感觉,我将不得不发布一些代码......
【问题讨论】:
-
当您说“库”时,您是指
.a文件还是.so文件? -
在链接实际调用未定义引用的内容之前,您不会收到错误消息。在可执行文件使用它之前,可能没有需要链接到未定义方法的类的实例化。