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

Undefined references when statically linking C++ and C libraries

本文关键字:未定义 引用 链接 c++ 静态      更新时间:2023-10-16

我有3个库,我试图链接(不止于此,但所有这些都需要这个解释)。"根"库是c++,它有第二个库作为它的依赖,也是c++。第三个库是c,它依赖于第二个库。

当链接这个项目,我得到未定义的引用,在第三个库(这是在c)从第二个库(这是c++)调用的所有方法。第三个库将其头文件正确地包含在"extern"C"中,因为它应该用于这种类型的使用。

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

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

我试着自己研究这个,几乎每一个结果都是"在括号里加上一个外部的"C"!",然而这已经是这里的情况了。我还认为这可能是链接器顺序问题,并验证了链接器命令中设置的链接器顺序是否合适。所以我不知道是什么导致了这一切。这似乎是一个名字混淆的事情,但我不知道这是怎么发生的,也不知道如何解决它。

我的问题是:这到底是怎么回事?我还能探索其他途径来解决这个问题吗?

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

我为这么长时间道歉,提前感谢所有让它走到这一步的人!

我设法找到了问题的原因。简而言之,CMake配置错误。

长版本是,当我们试图将库构建为静态时,我们通过CMake手动添加了定义(这是这里的情况)。有一个用于cAudio,以及OpenAL。当OpenAL编译时,它使用了CMake脚本部分提供的定义。这些定义不能与层次结构中的其他项目共享。因此,当cAudio编译导出宏的时候,没有解析为空白,而是解析为设置为"dllimport"。当cAudio去链接时,它期望以"_imp"为前缀的符号,这在编译库中不是这种情况。因此导致了我得到的未定义的引用。

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