0

最近,我下载了 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

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

4

1 回答 1

1

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

您不能这样做有几个原因,其中最简单的原因是 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 工具链重新构建 dll。我不相信源代码是公开的。否则只能使用 Visual Studio 构建 64 位程序。

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

于 2015-07-26T19:18:04.180 回答