如何在 Windows 上正确编译 RtMidi API

Posted

技术标签:

【中文标题】如何在 Windows 上正确编译 RtMidi API【英文标题】:How to compile RtMidi API properly on Windows 【发布时间】:2020-12-25 15:01:04 【问题描述】:

我在 Visual Studio 2019 上使用 C++,在尝试将我的项目链接到 PortAudio 时遇到问题。在项目中使用 RtAudio 头文件时,我收到错误消息“MidiInDummy:此类不提供任何功能”。我可以在网上找到的大多数解决方案都是将__WINDOWS_MM__ 添加到预处理器定义中并链接到winmm.lib(按照https://www.music.mcgill.ca/~gary/rtmidi/ 的说明)但是,这样做后,我仍然遇到同样的问题。

【问题讨论】:

【参考方案1】:

我收到错误消息“MidiInDummy:此类不提供任何功能。”

这警告没有定义有效的 MIDI API。警告是从rtMidi.cpp 中的MidiInDummy 类的构造函数发出的,它只是一个没有功能实现的占位符。

__WIN_MM__ 添加到预处理器定义中

对于 Windows 版本,这是错误的 #define,它解释了 MidiInDummy 警告。在Compiling 下的参考页面上列出的正确定义是:

#define __WINDOWS_MM__

定义 __WINDOWS_MM__ 后,在修复了一些剩余的小问题后,示例 cMidiIn.dsp 项目可以在 VS 2019 中正常构建:

error D8016: '/ZI' and '/Gy-' command-line options are incompatible - 将项目属性/C/C++/常规/调试信息从/ZI更改为/Zi

warning D9035: option 'Gm' has been deprecated and will be removed in a future release - 将项目属性/C/C++/代码生成/启用最小重建从/Gm 更改为/Gm-

warning C4138: '*/' found outside of comment - 在/*userData*/ 之前添加一个空格:

void mycallback(double deltatime, std::vector< unsigned char >* message, void* /*userData*/)

【讨论】:

抱歉,__WIN_MM__ 是我的错字,事实上我使用了正确的预处理器定义__WINDOWS_MM__。我已经编辑了帖子以更正它。我是要在预处理器定义中包含“#define”,还是 VS 会为我这样做?无论哪种方式,它都不起作用 @ducksforever 你必须在#include "RtMidi.h" 之前#define __WINDOWS_MM__ 或在项目的Properties / C/C++ / Preprocessor / Definitions 中定义它,就像示例cMidiIn.dsp 一样。如果您收到有关 MidiInDummy 的错误,则表示您没有正确定义它,因为 MidiInDummy 只会编译 #if !defined(__WINDOWS_MM__),正如您在 rtMidi.cpp 源文件中看到的那样。 我在 VS 中将定义添加到了错误的解决方案中。与以往一样,键盘和椅子之间存在问题。谢谢你的时间:)

以上是关于如何在 Windows 上正确编译 RtMidi API的主要内容,如果未能解决你的问题,请参考以下文章

尝试编译 RtAudio 时出现未定义的符号

如何明智地分配静态 RtMidi 回调对象?

使用 RtMIDI,MIDISendSysex 不向虚拟端口发送事件

无法将 Python 3.5 配置为在 Windows 上使用 Visual C++ 编译器

如何使用 LLVM 在 Windows 上为 ARM 编译 C++ 程序?

如何让pypi正确识别操作系统