C++ IrrKlang 声音错误- CreateIrrKlangDevice() 导致未定义的引用(真正的长引用)

Posted

技术标签:

【中文标题】C++ IrrKlang 声音错误- CreateIrrKlangDevice() 导致未定义的引用(真正的长引用)【英文标题】:C++ IrrKlang sound error- CreateIrrKlangDevice() results in undefined refrence to (really long refrence) 【发布时间】:2015-07-25 02:57:22 【问题描述】:

最近,我下载了 Irrklang 声音库以用于我的 C++ 程序。为了测试它,我在 Code::Block 的编译器设置和我的项目构建设置中安装并链接了该库。 但是,每当我尝试构建和运行以下代码时:

#include <irrKlang.h>
using namespace std;
using namespace irrklang;
int main()
    ISoundEngine* engine = createIrrKlangDevice();

“构建消息”选项卡引发以下错误:

|Line 5|undefined reference to`_imp___ZN8irrklang20createIrrKlangDeviceENS_21E_SOUND_OUTPUT_DRIVEREiPKcS2_'|

这是“构建日志”选项卡中的错误:

64bit-1.5.0\lib\Winx64-visualStudio\irrKlang.lib"
obj\Debug\main.o: In function `main':
C:/Users/Johnny/Desktop/Python/Learner/main.cpp:5: undefined reference to _imp___ZN8irrklang20createIrrKlangDeviceENS_21E_SOUND_OUTPUT_DRIVEREiPKcS2_'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

我必须告诉你,这是我第一次下载和使用 C++ 库。我用过这个教程:http://www.learncpp.com/cpp-tutorial/a3-using-libraries-with-codeblocks/

我在 google 上查找了这个错误,虽然有人遇到了同样的问题,但他们得到的所有解决方案要么过于模糊,要么他们的错误报告是由不同的错误引起的。

这是我浏览的一些页面:

http://www.ambiera.com/forum.php?t=939

我浏览的不仅仅是这个,主要是在同一个论坛上,但我最多只能发布两个链接,我认为更重要的是让你知道我是如何链接图书馆的。

【问题讨论】:

看起来您没有将import library 添加到您的项目中。链接器正在寻找您在 main 中调用的函数,但找不到它。 _imp 前缀表示函数(存根)位于导入库中(您应该已经收到并添加到您的项目中)。 import library ?那是什么? @PaulMcKenzie 你的程序正在调用一个函数。该功能在哪里?这就是链接器所抱怨的——它找不到它。该函数位于您的声音库应随附的导入库 (.LIB) 文件中。然后您需要将该文件添加到您的项目中,以便链接器知道在哪里可以找到该函数。顺便说一句,如果您打算使用第三方 DLL 和模块,则需要熟悉导入(和静态库)。事实上,您的 URL 链接概述了这一点:5) Tell the linker which static or import library files to link. 好的,所以我现在更密切地遵循该站点的指示。我的项目目录中有irrKlang.dll。我检查了链接器设置并确保 .lib 文件已链接。而且我仍然收到相同的错误消息。 除非您发布失败的链接器命令行,否则我们无法看到您如何链接程序或链接可能有什么问题。它在构建日志中(不是构建消息)。这是错误所在的g++ 命令行。 【参考方案1】:

您正在尝试链接 C++ DLL(或者更确切地说是 DLL 的导出 LIB) 它是在您使用 GNU C++ 构建的程序中使用 MS Visual Studio C++ 构建的。

您不能这样做有几个原因,其中最简单的原因是 MS 和 GCC 编译器对 C++ 符号采用不同的名称修饰约定。因此 您的编译器将irrklang::createIrrKlangDevice 破坏为:

ZN8irrklang20createIrrKlangDeviceENS_21E_SOUND_OUTPUT_DRIVEREiPKcS2_

出于链接目的,但在您尝试链接的导出库中,它 导出为:

createIrrKlangDevice@irrklang@@YAPEAVISoundEngine@1@W4E_SOUND_OUTPUT_DRIVER@1@HPEBD1@Z

你安装的 irrKlang 包存储了这个导出库 在irrKlang-64bit-1.5.0\lib\Winx64-visualStudio 中暗示它只是 与 Windows 64 位 Visual Studio 工具链兼容。

要将 64 位 irrKlang.dll 与您使用 GNU 工具链构建的 64 位程序链接,您 必须获得irrKlang 源代码并用您的 GNU 工具链。我不相信源代码是公开的。除此以外 您只能使用 Visual Studio 构建 64 位程序。

如果您满足于构建 32 位程序(将在 64 位 Windows 上运行), 那么您可以使用 irrKlang 1.5 的 32 位版本。它包含 使用 32 位 GCC 和 位于名为 win32-gcc 的子文件夹中,而不是 Winx64-visualStudio

【讨论】:

以上是关于C++ IrrKlang 声音错误- CreateIrrKlangDevice() 导致未定义的引用(真正的长引用)的主要内容,如果未能解决你的问题,请参考以下文章

将 IrrKlang 与 Ogre 一起使用

二进制文件不可执行 - c++ & irrklang

获取 irrklang - 在 sharpdevelop 工作

irrKlang 从 play2D() 获取 ISound*

由于 lib 错误,Visual Studio 未编译

C++ 中的 Playsound() 播放 windows 错误声音,我已经包含了 winmm.lib