mingw — C ++ неопределенная ссылка на определенную константу

Я прочитал несколько вопросов в StackOverflow о неопределенных ссылках, но, похоже, ни один из них не касается конкретно неопределенной ссылки на константу, определенную во включенном заголовке. Извиняюсь, если я где-то пропустил правильный ответ.

Я косвенно использую MinGW 32bit (4.9.2) для компиляции C ++ в Qt (5.5).

Один из включенных файлов определяет константу с #define но когда проект собран, компилятор жалуется на неопределенную ссылку в .cpp.

Странно, я пытался проверить, существует ли константа в строке выше ее использования, и это не имеет никаких проблем.

Вот вывод компилятора:

g++ -Wl,-subsystem,windows -mthreads -o debug\THEPROJECT.exe object_script.THEPROJECT.Debug  -lmingw32 -LC:/Qt/5.5/mingw492_32/lib -lqtmaind -lshell32 -lole32 -lQt5Quickd -lQt5Guid -lQt5Qmld -lQt5Networkd -lQt5Cored
./debug\RtAudio.o: In function `ZN11RtApiWasapi13getDeviceInfoEj':
C:\Users\ME\Documents\Code\build-THEPROJECT-Desktop_Qt_5_5_1_MinGW_32bit-Debug/../THEPROJECT/thirdparty/RtAudio.cpp:4128: undefined reference to `KSDATAFORMAT_SUBTYPE_IEEE_FLOAT'

Ранее в .cpp, есть

#include <audioclient.h>

который в свою очередь имеет

#include <mmreg.h>
#include <ks.h>
#include <ksmedia.h>

В пределах mmreg.h постоянная определяется

#define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
#define DEFINE_GUIDSTRUCT(g,n) DEFINE_GUIDEX(n)
#define DEFINE_GUIDNAMED(n) n
...
#define STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_IEEE_FLOAT)
DEFINE_GUIDSTRUCT("00000003-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_IEEE_FLOAT);
#define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT #define DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)

Может быть, стоит отметить, что в ksmedia.h это тоже определено. Помещая (а затем удаляя) директивы #error, я могу сказать, что это определение запускается, хотя, как ни странно, оно не выдает «переопределенное» предупреждение. то есть, похоже, нет #ifndef в обход этого.

#define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)

В файле .cpp используется константа

  if ( deviceFormat->wFormatTag == WAVE_FORMAT_IEEE_FLOAT ||
( deviceFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
( ( WAVEFORMATEXTENSIBLE* ) deviceFormat )->SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT ) )

В строке выше этого я проверил константу, поставив

#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#pragma message __STR1__(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)

и это успешно выводит #pragma message: KSDATAFORMAT_SUBTYPE_IEEE_FLOAT прямо перед неудачей. Вот фрагмент компилятора

g++ -c -pipe -fno-keep-inline-dllexport -g -std=c++0x -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -D__WINDOWS_WASAPI__ -DQT_QML_DEBUG -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I..\THEPROJECT -I. -I..\THEPROJECT\thirdparty -I..\THEPROJECT\thirdparty\maximilian -IC:\Qt\5.5\mingw492_32\include -IC:\Qt\5.5\mingw492_32\include\QtQuick -IC:\Qt\5.5\mingw492_32\include\QtGui -IC:\Qt\5.5\mingw492_32\include\QtANGLE -IC:\Qt\5.5\mingw492_32\include\QtQml -IC:\Qt\5.5\mingw492_32\include\QtNetwork -IC:\Qt\5.5\mingw492_32\include\QtCore -Idebug -IC:\Qt\5.5\mingw492_32\mkspecs\win32-g++  -o debug\RtAudio.o ..\THEPROJECT\thirdparty\RtAudio.cpp
..\THEPROJECT\thirdparty\RtAudio.cpp: In member function 'virtual RtAudio::DeviceInfo RtApiWasapi::getDeviceInfo(unsigned int)':
..\THEPROJECT\thirdparty\RtAudio.cpp:4122:57: note: #pragma message: KSDATAFORMAT_SUBTYPE_IEEE_FLOAT

Вероятно, это действительно глупая ошибка, но я уже 2 дня тряс головой. Любые подсказки, пожалуйста?

РЕДАКТИРОВАТЬ: я включил более полную ссылку на то, что в mmreg.h

0

Решение

Оказывается, что проблема отсутствовала библиотеки в операторе компиляции. Эти библиотеки кажутся неявными при компиляции с Microsoft Visual Studio, но их необходимо явно связывать при компиляции с MinGW.

Добавляя -lwinmm -lksuser -luuid проблема была решена.

При компиляции RtAudio для элемента управления WASAPI под Windows эти библиотеки перечислены в Страница RtAudio о компиляции, так что было глупо с моей стороны не включать их.

Как примечание, ошибка компилятора, по-видимому, возникает при компиляции RtAudio.cpp в RtAudio.o, а не на этапе компоновки, поэтому я удивлен, что эта очевидная ошибка компоновки обнаружилась на этом этапе.

Спасибо всем, кто предоставил комментарии или ответы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]