В том числе 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");