3

我有 3 个我正在尝试链接的库(不仅如此,但所有这些都是解释所需要的)。“根”库是 c++,它有第二个库作为它的依赖项,也是 c++。第三个库是 c 并且是第二个库的依赖项。

链接这个项目时,我得到了对从第二个库(c++)调用的第三个库(c 中)中所有方法的未定义引用。第三个库的标题正确地包含在“extern“C””中,因为它应该用于这种类型的使用。

在尝试解决这个问题时,我发现通知库它正在构建为静态的宏没有正确设置,所以我修复了这个问题,发现它改变了另一个放在所有 c 样式函数前面的宏从导出改为说“extern“C””。回顾一下,在我修复了另一个宏之后,c++ 库中的 c 样式方法在它们前面被声明为“extern“C””。当我这样做时,我在“根”库的第二个库中调用的所有 c 样式方法开始获得未定义的引用。

我认为这很奇怪,因为我没有看到其他库这样做,所以我推荐了将宏定义为“extern“C””的行部分,而不是将其留空。当我这样做时,对第二个库中 c 风格方法的未定义引用消失了,对第三个库中方法的未定义引用返回。

我自己尝试过研究,几乎每个结果都是“在括号中放一个”extern“C”!”,但是这里已经是这样了。我还认为这可能是一个链接器顺序问题,并验证了在去链接器的命令中设置的链接器顺序是合适的。所以我不知道是什么原因造成的。这似乎是一个名称混乱的事情,但我一生都无法找到这是怎么发生的或如何解决它。

我的问题:到底发生了什么?我可以探索哪些其他途径来尝试解决这个问题?

我在 Windows XP 32 位上,使用 MinGW 进行编译。如果你想看代码……那有点复杂,因为这是一个大项目,但根库是我正在开发的游戏引擎,第二个库是 cAudio,第三个库是 OpenAL soft . 这里是 repo 的根目录,这里是 cAudio 的基本目录,这里是我们正在使用的 OpenAL 软件的基本目录。

我为这么长时间道歉,在此先感谢所有做到这一点的人!

4

1 回答 1

0

我设法找到了问题的原因。简短的版本是 CMake 配置错误。

长版本是当我们尝试将库构建为静态时,我们通过 CMake 手动添加了定义(这里就是这种情况)。cAudio 和 OpenAL 都有一个。当 OpenAL 编译它时,它使用了适当的 CMake 脚本部分中提供的定义。这些定义未与层次结构中的其他项目共享。因此,当 cAudio 编译导出宏的时候并没有解决为空白,而是解决了将其设置为“dllimport”。当 cAudio 进行链接时,它需要以“_ imp ”为前缀的符号,而编译库中的情况并非如此。从而导致我得到未定义的引用。

我通过在 cAudio CMake 中添加适当的定义解决了这个问题,以便在使用 OpenAL 包含编译 cAudio 时正确解析导入宏。

于 2013-03-27T04:49:42.817 回答