2013-03-26 196 views
3

我有3个库我试图链接(不止这些,但所有需要的解释)。 “根”库是C++,它有第二个库作为它的依赖,也是C++。第三个库是c,并且是第二个库的依赖。静态链接C++和C库时未定义的引用

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

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

我认为这很奇怪,因为我没有看到其他库这样做,所以我建议将宏定义为“extern”C“”的部分放在空白处。当我这样做时,未定义的对第二个库中c样式方法的引用就消失了,并返回了第三个库中方法的未定义引用。

我试图自己研究这个问题,并且几乎每个结果都是“将一个”extern“C”放在它的括号内!“,但是这已经是这种情况了,我也认为它可能是一个链接器命令问题,并验证链接器命令中设置的链接器的顺序是否合适,所以我不知道是什么原因造成的。这似乎是一个名字捣乱的东西,但我不能在我的生活中找到这是怎么发生的或如何解决它

我的问题:这到底是怎么回事什么其他途径可我探索,试图解决此

我在Windows XP 32位,编译?与MinGW。如果你想看代码...以及at有点复杂,因为这是一个大项目,但根库是我正在开发的游戏引擎,第二个库是cAudio,第三个库是OpenAL soft。 Here是回购的根目录,here是cAudio的基本目录,而here是我们使用的OpenAL软件的基础目录。

我很抱歉这么长时间,感谢提前向任何人做出这个至今!

+0

难道不是相反 - C++代码需要extern C而不是C/C++混合的c代码才能一起工作吗? – Amit 2013-03-26 05:11:54

+0

如果打算从C代码调用这些函数中的任何一个,则在第二个库extern“C”中创建所有'C风格'函数将是必需的。这似乎并不是这种情况。但是,只要根库也可以看到外部“C”声明,它就应该是无害的。既然你没有解决,我想不是这样。这非常简单,任何由C代码调用的C++函数都需要extern“C”,任何由C++代码调用的C函数都需要extern“C”,但是编译为C的任何东西都不应该看到extern“C”。我会抛弃宏,只是手工做这些东西。 – john 2013-03-26 06:31:57

+0

@Amit我的理解是,当使用C代码编译C++库时,必须将C代码封装在“extern”C“”中。这可以在C库头文件(也可能是源文件)中使用“__cplusplus”宏或包含在C++文件中。在这种情况下,前者适用。除非我误解了你的评论,否则“extern”C“”的位置似乎不成问题。 – 2013-03-26 06:32:47

回答

0

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

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

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

相关问题