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

C++ 链接如何失败:对库的未定义引用,c++,linker,C++,Linker,我继承了一个代码项目,其中包含几个单独编译的代码库,然后在编译工具中链接。它应该是每个工具想要的中文菜单。这都是用Linux写的,用C++编写,带有Qt。目前的设计有几个问题,但我正在学习处理 这期最新的杂志让我目瞪口呆。主库是实用程序。它包含一些类,并编译成.a库文件。另一个库是我们的数据库接口。它具有引用实用程序头文件的类文件(它们都是共享的),但CPP文件不包括在数据库接口中。数据库接口也编译成.a库。最后,我们有一个CMDPrompt工具,可以导入Utilities.a和Database

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

这期最新的杂志让我目瞪口呆。主库是实用程序。它包含一些类,并编译成.a库文件。另一个库是我们的数据库接口。它具有引用实用程序头文件的类文件(它们都是共享的),但CPP文件不包括在数据库接口中。数据库接口也编译成.a库。最后,我们有一个CMDPrompt工具,可以导入Utilities.a和DatabaseInterfaces.a库。CMDPrompt不编译。相反,我得到了几个错误,表明我对实用程序中的一个对象有一个未定义的引用

在多次尝试修复此问题后,我最终将CPP文件直接包含在CMDPrompt.pro中。它成功了,或者至少现在正在为实用程序中的其他类查找新的未定义引用。这向我证实,不知何故,这些项目没有正确链接。我本以为,因为实用程序库是链接在中的,所以我会用它获得所有的H/CPP优点。我怀疑问题在于DatabaseInterfaces库只针对H文件进行编译,并且需要相同的实用程序。我尝试将该库添加到DatabaseInterfaces.pro中,但没有任何效果


虽然我不是一个C++程序员,但我相信我理解了链接过程的要点,我显然错过了一些东西。以下是我的问题。考虑到不同库之间的关系,链接器应该如何工作?为什么数据库接口是一个仅使用H文件的编译?解决此问题的最佳方法是什么?

您需要按正确的顺序链接库-听起来像是实用程序。a需要最后链接。我不知道如何在Qt中实现这一点,但这正是您需要实现的。

您需要按正确的顺序链接库-听起来像是实用程序。a需要最后链接。在QT中,我不知道如何做到这一点,但这是你需要实现的。需要一个有经验的C++开发人员来研究和研究这个代码库及其构建系统,抱歉。如果不检查实际代码和makefile,任何人都无法告诉您。首先,与您的印象相反,
.a
库不包含头文件。底线:需要有经验的开发人员来解决这个问题。这无法在stackoverflow上进行远程调试。@PaulSanders,这似乎已经解决了它。我很想知道为什么链接的顺序会有所不同,但我可能会跟随这些面包屑。我相信你的回答。你介意把你的评论作为完整的回答吗?也许还可以多加一点解释。再次感谢。@BSD好的,我已经做到了。链接库时,GNU链接器只查找出现在前面文件中的符号引用,因此,如果您以错误的顺序链接内容,在链接过程结束时,某些符号引用仍然不满意。现在我知道要查找什么,我发现了一个相关的问题。这可能也与操作系统有关吗?当我在Linux上运行时,原始代码在Windows系统上运行。我发现这个错误存在于多个其他工具中。一旦我确定了顺序,一切都会运行。因此,如果我继承的代码在发送给我之前处于正常工作状态,那么原始的顺序一定是正常的。这让我怀疑在Windows中顺序并不重要。或者只是Windows+Qt?没错。Windows(MSVC)链接器不关心在命令行上提供库的顺序。