简体   繁体   中英

Including winmm.lib does not work

I'm trying to code a little program with a simple number guessing game.

I want to play an mp3 file behind it using a simple thread. I have read How to play or open *.mp3 or *.wav sound file in c++ program? , but I can't get it to work. It always spews out the error:

||=== 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)) ===|

Here is my code:

#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);
}

I tried downloading winmm.lib from somewhere, because it doesn't seem to find the library (just a guess).

Am I doing something wrong, or do I need to include some other header?

If you read the compiler output carefully, you will see this warning:

warning: ignoring #pragma comment [-Wunknown-pragmas]

That means your compiler (GCC) does not support your code's use of #pragma comment , and so winmm.lib ends up not getting linked into your final executable, thus causing the subsequent linker error:

undefined reference to `_imp__mciSendStringA@16'

This is not a matter of the linker not being able to find winmm.lib , it is a matter of the linker not being told to use winmm.lib in the first place.

#pragma is used to invoke compiler-specific commands. Not all compilers implement #pragma comment . VC++ does (and so do a few others, like BCC32/64), but GCC does not. The other question you linked to was tagged visual-c++ , so #pragma comment was appropriate in that case.

In your case, you will have to adjust your build process accordingly to use another way to tell the linker to use winmm.lib . You do that in GCC by using the -l option when invoking the linker, eg -lwinmm .

For future visitors that use gcc or g++, we can link the library manually by specifying -l flag, so the ld.exe (linker) can find it.

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

I just tried to use gcc multimedia.c -o multimedia -l Winmm with pragma but it did not work I got

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");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM