链接如何失败:对库的未定义引用

How is linking failing: Undefined reference to library

我继承了一个代码项目,其中包含几个单独编译的代码库,然后在编译工具中链接。它应该是每个工具想要的中文菜单。这一切都是在 Linux 上用 C++ 和 Qt 编写的。目前的设计有几个问题,但我正在学习处理。

最新一期看得我傻眼了。主库是实用程序。它包含一些 classes 并编译成一个 .a 库文件。另一个库是我们的 DatabaseInterfaces。它有 class 个文件,这些文件引用实用程序中的头文件(它们都是共享的),但 CPP 文件不包含在 DatabaseInterfaces 中。 DatabaseInterfaces 也编译成一个.a 库。最后,我们有一个 CMDPrompt 工具可以导入 Utilities.a 和 DatabaseInterfaces.a 库。 CMDPrompt 不编译。相反,我收到几个错误,表明我对实用工具中的一个对象有未定义的引用。

经过几次不同的尝试来解决这个问题,我最终直接将 CPP 文件包含在 CMDPrompt.pro 中。它起作用了,或者至少它现在正在为实用程序中的其他 classes 寻找新的未定义引用。这向我证实了项目以某种方式没有正确链接。我本以为因为 Utilities 库是链接的,所以我会得到它的所有 H/CPP 优点。我怀疑问题在于 DatabaseInterfaces 库仅针对 H 文件进行编译并且需要相同的 Utilities.a 库。我尝试将该 LIB 添加到 DatabaseInterfaces.pro,但没有任何效果。

我不是受过培训的 C++ 程序员,虽然我相信我理解链接过程的要点,但我显然遗漏了一些东西。这是我的问题。鉴于不同库之间的关系,链接器应该如何工作?为什么 DatabaseInterfaces.a 只用 H 文件编译?解决此问题的最佳方法是什么?

您需要以正确的顺序 link 库 - 听起来 Utilities.a 需要最后 link 编辑。我不知道你如何在 Qt 中做到这一点,但这就是你需要实现的目标。