静态链接C ++和C库时未定义的引用

时间:2013-03-26 05:08:17

标签: c++ c static-linking undefined-reference

我有3个我试图链接的库(不止这些,但这个解释需要的只是)。 “root”库是c ++,它有第二个库作为它的依赖,也是c ++。第三个库是c,是第二个库的依赖。

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

在尝试对此进行故障排除时,我发现用于通知库它正在构建为静态的宏没有正确设置,所以我修复了它并发现它改变了另一个宏放在所有c前面从导出的样式函数代替说“extern”C“”。回顾一下,在我修复了另一个宏之后,c ++库中的c风格方法被声明为“extern”C“”。当我这样做时,我在“根”库中的第二个库中调用的所有c风格的方法都开始得到未定义的引用。

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

我自己试图对此进行研究,并且几乎所有的结果都是“放一个”extern“C”在它的括号内!“,但这已经是这种情况。我也认为它可能是一个链接器订单问题,并且验证了链接器命令中设置的链接器顺序是否合适。所以我不知道是什么导致这个。它似乎是一个名称错误的东西,但我不能为我的生活找到如何这种情况正在发生或如何解决它。

我的问题:到底是怎么回事?我可以探索哪些其他途径来尝试解决这个问题?

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

我为这么长的事情道歉,感谢提前做到这一点的任何人!

1 个答案:

答案 0 :(得分:0)

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

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

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