未定义的对“KSDATAFORMAT_SUBTYPE_PCM”的引用

时间:2015-03-11 16:52:05

标签: c++ visual-studio audio mingw

我将一些代码从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添加到链接器选项中,但我仍然遇到了这个错误。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您应该链接libksuser.a(例如:#!/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 )以获取KSDATAFORMAT_SUBTYPE_PCM。 关于符号属于哪个库的文档很少,所以我写了一个小脚本来帮助搜索你应该链接的库

function cleanup() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Form responses 1');
  var values = sheet.getDataRange().getValues();
  var today = Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), 'MM/dd/yyyy')
  for (var i = values.length - 1; i >= 0;  i--) {
    if ( values[i][4] != '' && dateDiffInDays(values[i][4],today) > 365 ) {
      sheet.deleteRow(i+1);
    }
  }  
};

function dateDiffInDays(d1,d2) {
  var date1 = new Date(d1);
  var date2 = new Date(d2);
  var timeDiff = date1.getTime() - date2.getTime();
  return Math.ceil(timeDiff / (1000 * 3600 * 24)); 
};

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