В том числе winmm.lib не работает

Я пытаюсь написать небольшую программу с простой игрой в угадывание чисел.

Я хочу воспроизвести mp3-файл, используя простой поток. Я прочитал, как играть или открыть *.mp3 или *.wav звуковой файл в программе C++?, но я не могу заставить его работать. Всегда выдает ошибку:

||=== Build: Debug in pinkpantherguessinggame (compiler: GNU GCC Compiler) ===|
C:\Users\Leon\Desktop\pCode\pinkpantherguessinggame\main.cpp|8|warning: ignoring #pragma comment  [-Wunknown-pragmas]|
obj\Debug\main.o||In function `Z11pinkpantherv':|
C:\Users\Leon\Desktop\pCode\pinkpantherguessinggame\main.cpp|16|undefined reference to `_imp__mciSendStringA@16'|
||error: ld returned 1 exit status|
||=== Build failed: 2 error(s), 1 warning(s) (0 minute(s), 1 second(s)) ===|

Вот мой код:

#include <cstdlib>
#include <ctime>
#include <iostream>
#include <windows.h>
#include <thread>
#include <Mmsystem.h>

#pragma comment(lib, "Winmm.lib")

using namespace std;

void start(int);

void pinkpanther()
{
    mciSendString("open \"‪E:\\Users\\cdev\\Musik\\pinkpanther.mp\" type mpegvideo alias mp3", NULL, 0, NULL);
    mciSendString("play mp3", NULL, 0, NULL);
}

Я пытался скачать winmm.lib откуда-то, потому что он, кажется, не находит библиотеку (только предположение).

Я делаю что-то не так или мне нужно включить какой-нибудь другой заголовок?

3 ответа

Решение

Если вы внимательно прочитаете вывод компилятора, вы увидите это предупреждение:

предупреждение: игнорирование комментария #pragma [-Wunknown-pragmas]

Это означает, что ваш компилятор (GCC) не поддерживает использование вашего кода #pragma comment, так что winmm.lib в конечном итоге не попадает в ваш конечный исполняемый файл, что приводит к следующей ошибке компоновщика:

неопределенная ссылка на `_imp__mciSendStringA@16'

Дело не в том, что компоновщик не может найти winmm.lib, дело в том, что компоновщику не сказано использовать winmm.lib на первом месте.

#pragma используется для вызова специфичных для компилятора команд. Не все компиляторы реализуют #pragma comment, VC++ делает (и некоторые другие, как BCC32/64), но GCC нет. Другой вопрос, на который вы ссылались, был помечен visual-c++, так #pragma comment было уместно в этом случае.

В вашем случае вам придется соответствующим образом скорректировать процесс сборки, чтобы использовать другой способ указать компоновщику использовать winmm.lib, Вы делаете это в GCC, используя -l опция при вызове компоновщика, например -lwinmm,

Для будущих посетителей, использующих gcc или g++, мы можем связать библиотеку вручную, указав флаг -l, чтобы ld.exe (компоновщик) мог ее найти.

g++ test.cpp -o test.exe -lWinmm

Я просто пытался использовать с прагмой, но это не сработало, я получил

      multimedia.c: In function 'int main()':
multimedia.c:5:5: error: 'mciSendString' was not declared in this scope
    5 |     mciSendString("open video.mpg alias file1");
Другие вопросы по тегам