为什么这个简单的代码不与Winmm.lib链接

问题描述 投票:0回答:1

我使用的是 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
文件。

我不知道为什么这段代码无法编译。真诚地希望有人能给出合理的解释。我已准备好回答任何其他问题。

c++ windows linker g++ mci
1个回答
0
投票

正如@john 在对我的问题的评论中提到的,

g++
命令参数和标志的顺序很重要。我应该写
g++ test.cpp -lWinmm
而不是
g++ -lWinmm main.cpp
。好好阅读该主题就是这个问题的答案。

© www.soinside.com 2019 - 2024. All rights reserved.