对“KSDATAFORMAT_SUBTYPE_PCM”的未定义引用

undefined reference to `KSDATAFORMAT_SUBTYPE_PCM'

我正在将一些代码从 Visual Studio 移植到 Mingw。尝试构建代码时出现以下链接器错误

 undefined reference to `KSDATAFORMAT_SUBTYPE_PCM'

这是导致问题的代码段

                WAVEFORMATEXTENSIBLE *pex = reinterpret_cast<WAVEFORMATEXTENSIBLE*>(new char[sizeof(WAVEFORMATEXTENSIBLE)]);

                ZeroMemory( pex, sizeof(*pex));

                pex->Format.nChannels = channels;
                pex->Format.nSamplesPerSec = samplesPerSec;
                pex->Format.nAvgBytesPerSec = samplesPerSec * blockAlign;
                pex->Format.wBitsPerSample = bitsPerSample;
                pex->Format.nBlockAlign =blockAlign;

                pex->Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
                pex->Format.cbSize = sizeof(*pex)-sizeof(pex->Format);

                pex->Samples.wValidBitsPerSample = bitsPerSample;

                pex->SubFormat = KSDATAFORMAT_SUBTYPE_PCM; // <--- ERROR

看来我需要输入库文件的名称才能消除此链接器错误。关于如何解决这个问题的任何建议?我已经将 dsound 、 winmm 、 ks 、 ksuser 、 ksguid 和 ole32 添加到链接器选项,但我仍然收到该错误。

看起来KSDATAFORMAT_SUBTYPE_PCM是一个函数指针。 如果您非常确定已经包含了所有需要的库,我建议您重新排列库的链接顺序。因为 g++(不确定 mingw 是否也这样做)会查看您链接的文件并获得它想要的内容,而忽略其余部分。有时,如果顺序错误,后面的库依赖于前面的库,这可能会导致你看到的。

您应该 link libksuser.a(例如:-lksuser)以获得 KSDATAFORMAT_SUBTYPE_PCM。 关于符号属于哪个库的文档很少,所以我写了一个小脚本来帮助搜索你应该 link

#!/bin/sh

 for lib in `ls /mingw64/x86_64-w64-mingw32/lib/*.a`
 do
    echo "search in $lib"
    nm $lib | grep KSDATAFORMAT_SUBTYPE_PCM
 done

随意更改库位置和要搜索的符号