我使用的是 64 位系统的 Windows 10,我正在尝试使用 C++ 播放 mp3 音频文件。我的代码行来自于 this 问题的答案。整个主文件如下:
#include<Windows.h>
int main()
{
mciSendString("open \"Test.mp3\" type mpegvideo alias mp3", NULL, 0, NULL);
mciSendString("play mp3", NULL, 0, NULL);
}
作为编译器,我使用 G++,并使用此命令构建程序
g++ -lWinmm main.cpp
。
我希望这段代码能够编译并播放存储在
Test.mp3
中的简短示例声音,但是编译失败,以下是控制台的输出。
C:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\myName\AppData\Local\Temp\ccic5o7r.o:Main.cpp:(.text+0x2b): undefined reference to `__imp_mciSendStringA'
C:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\myName\AppData\Local\Temp\ccic5o7r.o:Main.cpp:(.text+0x4f): undefined reference to `__imp_mciSendStringA'
collect2.exe: error: ld returned 1 exit status
我的编辑器显示函数
mciSendString
扩展为 mciSendStringW
在我看来这有点奇怪,因为控制台输出提到了函数 mciSendStringA
但我是否在中明确使用 mciSendStringW
或 mciSendStringA
并不重要我的主要功能,错误保持不变。 Microsoft 的 page 表示该函数来自库 Winmm.lib
,而这正是我在 G++ 编译命令中额外链接的函数。
实际的
Winmm.lib
文件确实存在于C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22000.0\um\x64
目录中,但它们的名称实际上是大写的WinMM.Lib
,这很奇怪,因为在前面提到的微软页面中告诉文件名是Winmm.lib
。唉,大小写没有任何区别。我还使用 G++ 的 -L
标志来指定文件所在的目录,但这没有任何作用,因为 G++ 默认情况下会在该文件夹中查找 lib
文件。
我不知道为什么这段代码无法编译。真诚地希望有人能给出合理的解释。我已准备好回答任何其他问题。
正如@john 在对我的问题的评论中提到的,
g++
命令参数和标志的顺序很重要。我应该写 g++ test.cpp -lWinmm
而不是 g++ -lWinmm main.cpp
。好好阅读该主题就是这个问题的答案。