【问题标题】:Including winmm.lib does not work包括 winmm.lib 不起作用
【发布时间】:2019-01-31 04:24:36
【问题描述】:

我正在尝试编写一个带有简单猜数字游戏的小程序。

我想用一个简单的线程在它后面播放一个 mp3 文件。我已经阅读了How to play or open *.mp3 or *.wav sound file in c++ program?,但我无法让它工作。它总是吐出错误:

||=== 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,因为它似乎找不到库(只是猜测)。

我做错了什么,还是需要包含其他标题?

【问题讨论】:

  • 当您使用 gcc 但想将 windows 库与 pragma 链接时似乎有些不对劲......我相信 pragma 只是 Visual Studio,但我不是 100% 确定,因为我不使用任何东西别的。您可能想了解如何将库与您的特定编译器链接,以及这些 Windows 库在该环境中是否可用。
  • 阅读错误信息。 “main.cpp|16|undefined reference to `_imp__mciSendStringA”确切地告诉您问题出在哪里(您可能希望对函数名称进行分解以提高可读性)。您正在调用一个函数,该函数不是由您链接的任何目标文件/库文件提供的(您甚至被告知 what 函数)。很可能您只需要告诉链接器有关定义丢失符号的丢失文件。
  • @jesper 最有可能是未定义的,因为他甚至没有链接。我看到一条关于忽略他试图用来链接的编译指示的消息。
  • “我尝试从某处下载 winmm.lib” - 嗯。这似乎是一个真的坏主意。 不要从互联网上的随机站点下载并运行随机二进制文件。反而;找出问题实际上是什么,然后如果你缺少一个库,找到官方(希望是值得信赖的)分发点,然后从那里下载(最好是源 ypu 可以在编译之前检查而不是仅仅信任二进制文件)。
  • @Christopher Pisz - 我认为你是对的。来源有“#pragma comment(lib, "Winmm.lib")”。谈论将自己绑定到特定平台。这不是链接库的正确跨平台方式。

标签: c++ windows audio winmm


【解决方案1】:

如果你仔细阅读编译器的输出,你会看到这个警告:

警告:忽略#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 option 来执行此操作,例如 -lwinmm

【讨论】:

  • 这帮助很大!我查看了如何在我的 IDE 中链接库,然后它就像一个魅力,代码不能播放我的 mp3,但这本身就是另一个问题!谢谢!
  • 小注:gcc(如果是 MinGW 的一部分,但我认为它也适用于其他构建工具链)将链接到 libwinmm .a(也是工具链的一部分)。在某些情况下,格式甚至不像我在stackoverflow.com/questions/45340527/…(中间某处)中显示的那样(对于clang)。
【解决方案2】:

对于以后使用 gcc 或 g++ 的访问者,我们可以通过指定 -l 标志手动链接库,以便 ld.exe(链接器)可以找到它。

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

【讨论】:

    【解决方案3】:

    我刚刚尝试将 gcc multimedia.c -o multimedia -l Winmm 与 pragma 一起使用,但它不起作用 我得到了

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

    【讨论】:

      猜你喜欢
      • 2015-02-21
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      相关资源
      最近更新 更多