繁体   English   中英

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

[英]Undefined references when statically linking C++ and C libraries

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

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

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

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

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

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

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

我为此感到抱歉这么久,感谢任何能够做到这一点的人!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM