【问题标题】:How to use audiere dll with MinGW如何将audiere dll与MinGW一起使用
【发布时间】:2012-09-05 15:50:50
【问题描述】:

我正在使用用 MinGW g++ 编译器编译的 wxWidgets 构建一个项目。我也在使用 wxWidgets 平台的一个组件来播放 mp3 声音片段,但是它不可靠,所以我去寻找另一个解决方案。我找到了 audiere 并从他们的网站下载了 1.9.4 版本。该软件包包含一个 *.lib 文件和一个 *.dll。我试图将它添加到我的项目中,但它不起作用(我认为是因为我下载的包是在 MSVC 中编译的)。

我使用名为 lib2a 的工具创建了一个 *.def 文件,以将 MSVC 库转换为可以与 MinGW 一起使用的 .a 库。 def 文件有这些定义...

库“audiere.dll” 出口 _AdrCreateLoopPointSource@4 _AdrCreateMemoryFile@8 _AdrCreatePinkNoise@0 _AdrCreateSampleBuffer@20 _AdrCreateSampleBufferFromSource@4 _AdrCreateSquareWave@8 _AdrCreateTone@8 _AdrCreateWhiteNoise@0 _AdrEnumerateCDDevices@0 _AdrGetSampleSize@4 _AdrGetSupportedAudioDevices@0 _AdrGetSupportedFileFormats@0 _AdrGetVersion@0 _AdrOpenCDDevice@4 _AdrOpenDevice@8 _AdrOpenFile@8 _AdrOpenMIDIDevice@4 _AdrOpenSampleSource@8 _AdrOpenSampleSourceFromFile@8 _AdrOpenSound@12 _AdrOpenSoundEffect@12

当我去链接我的项目时,我收到以下错误:

* MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x8291):对_imp__AdrOpenDevice@8' *** MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x82db): undefined reference to的未定义引用imp_AdrOpenSampleSource@8' * MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x830f): 未定义引用_imp__AdrOpenSound@12' *** MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x87ce): undefined reference toimp_AdrOpenDevice@8' * MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x8818): 对_imp__AdrOpenSampleSource@8' *** MinGWUnicodeRelease/AlphaPanel.o:AlphaPanel.cpp:(.text+0x884c): undefined reference to的未定义引用imp_AdrOpenSound@12'

例如,在我的代码中,函数是“OpenDevice”...在 def 文件中是 >“_AdrOpenDevice@8”,但在我的未定义引用链接错误中,它是“imp_AdrOpenDevice@ 8"。所以我头晕目眩,现在不知道该怎么办。

有没有一种简单的方法可以解决 dll 中的名称错误问题?

也许用二进制编辑器编辑它以“修复”名称并让它与我现有的代码一起工作(没有下载整个audiere代码来重新编译并使用MinGW创建dll [如果可能的话] ...我如果可以的话,想避免这种情况)...我的起点是一个 *.lib 文件和一个在 MSVC 中创建的 dll,但我需要在 MinGW 中使用它。

有人知道怎么做吗?

【问题讨论】:

    标签: visual-c++ dll linker mingw name-mangling


    【解决方案1】:

    我想出了如何在 Windows 中使用audiere....(这是我的解决方案,但如果您想使用它并且需要做类似的事情,您可能会发现这作为起点很有用)...

    我收到一大堆关于拥有虚拟函数但没有虚拟析构函数的警告消息......不知道如何摆脱这些,但它仍然有效。

    1) 下载适用于 windows 的 1.9.4 软件包的二进制文件 2)从此包中,您只需要3个文件。 audiere.h、audiere.dll 和audiere.lib 位于不同的目录中。 3) 将audiere.lib 重命名为audiere.a 4) 将audiere.dll 复制到运行可执行文件的同一目录中,以便在运行时找到它。 5) 将audiere.a 复制到链接器目录,并将其添加到项目中的文件列表中。 6) 将audiere.h 复制到所有其他*.h 文件所在的源目录。 7) 在源代码的 *.h 文件中,添加 #include "audiere.h" (注意不是) 8) 同样在 *.h 文件中,添加以下内容作为全局变量(我不使用命名空间,所以我指定了完全限定名称)

    audiere::AudioDevicePtr device;
    audiere::OutputStreamPtr sound;
    

    9) 在您的 *.cpp 文件的构造函数中,添加以下内容:

    device = audiere::OpenDevice();
    

    10) 添加一个计时器,以便您可以监控声音剪辑何时播放完毕。对我来说,它每秒发射 4 次。剪辑完成后,计时器停止。这是我的代码:

    void MyClass::OnTimerEvent( wxTimerEvent& event )
    {
       bool restartTimer = true;
       bool isItPlaying;
    
       timer.Stop();
       isItPlaying = sound -> isPlaying();
       // check status of audio clip
    
       if (isItPlaying == false)
          timer.Start(250);
       else {
          // re-enable any controls you disabled while audio clip was playing
    
       } // end else
    } // end OnTimerEvent
    

    11) 在您真正想要启动(加载和播放)声音剪辑的代码中 - 添加如下内容:

    (请注意,您需要 char_str 方法将其从 wxString 对象中提取出来)

    fileName.sprintf(wxT("c:\\testsound.mp3"));
    sound = audiere::OpenSound(device, fileName.char_str(), true);
    sound -> play();
    timer.Start(250);
    

    12) 假设您已经加载了剪辑并且想要再次播放它而不重新加载它。在这种情况下,只需重复步骤 11 中的最后两行(声音 -> play(); 和 timer.Start(250);)

    简而言之,应该可以帮助您入门。

    【讨论】:

    • 这是一个很好的答案。
    【解决方案2】:

    请原谅,您的源代码在哪个 *.h 文件中? :) 告诉人们使用哪些文件可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 2011-01-23
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多