ページ 1 / 1
MIDIプログラミングやりたいんだが
Posted: 2015年11月04日(水) 19:34
by Kazuya
Microsoft Visual studio Express 2015 for Windows desktop
を使ってプログラミングをしています。
次のプログラムを打って実行したのですが、次のようなエラーが起きて実行できません・・・どうすれば解決できるでしょうか。
/*プログラム*/
#include <windows.h>
#include <mmsystem.h>
int main(void) {
HMIDIOUT hMidiOut; /* MIDI 出力デバイスのハンドル */
midiOutOpen(&hMidiOut, MIDI_MAPPER, 0, 0, 0); /* MIDI 出力デバイスを開く */
midiOutShortMsg(hMidiOut, 0x007f3c90); /* 中央の C (C4) を強さ 127 で鳴らす */
Sleep(1000); /* 1000ms 間処理を中断 */
midiOutShortMsg(hMidiOut, 0x007f3c80); /* 中央の C (C4) の再生を止める */
midiOutReset(hMidiOut); /* 全チャンネルをノートオフ */
midiOutClose(hMidiOut); /* MIDI 出力デバイスを閉じる */
return 0;
}
/*エラー文*/
LNK1120 4件の未解決の外部参照
LNK2019 未解決の外部シンボル_imp_midiOutOpen@20が関数_mainで参照されました。
LNK2019 未解決の外部シンボル_imp_midiOutClose@4が関数_mainで参照されました。
LNK2019 未解決の外部シンボル_imp_midiOutShortMsg@8が関数_mainで参照されました。
LNK2019 未解決の外部シンボル_imp_midiOutReset@4が関数_mainで参照されました。
Re: MIDIプログラミングやりたいんだが
Posted: 2015年11月04日(水) 19:45
by 夢幻ノ月夜
MIDIIOっていうライブラリ使うとスゲェ楽
ライブラリにこだわりがないならオススメする
Re: MIDIプログラミングやりたいんだが
Posted: 2015年11月04日(水) 19:49
by 夢幻ノ月夜
後今の状況で考えられるのは
ライブラリの依存設定してないとか
ヘッダのインクルード忘れてるとかそんなノリ
関数の定義が見つかってないご様子
Re: MIDIプログラミングやりたいんだが
Posted: 2015年11月04日(水) 20:31
by Kazuya
返信ありがとうございます。
今一通りMIDIIOの設定を行ったのですが(ネット情報により)、
どうもうまくいきませんでした・・・相変わらずエラーだらけです(笑)
ライブラリの依存設定とは何でしょうか?
いろいろ初心者過ぎてわからない部分がたくさんです・・・ヘッダのインクルードは問題ないと思っていました。
Re: MIDIプログラミングやりたいんだが
Posted: 2015年11月04日(水) 20:42
by 夢幻ノ月夜
2015はよくわからないけど
2010以降はプロジェクトのプロパティから
VC++ディレクトリとかなんとかでライブラリファイル・インクルードファイルを設定出来た気がする
Re: MIDIプログラミングやりたいんだが
Posted: 2015年11月04日(水) 22:11
by YuO
Kazuya さんが書きました:LNK2019 未解決の外部シンボル_imp_midiOutOpen@20が関数_mainで参照されました。
LNK2019 未解決の外部シンボル_imp_midiOutClose@4が関数_mainで参照されました。
LNK2019 未解決の外部シンボル_imp_midiOutShortMsg@8が関数_mainで参照されました。
LNK2019 未解決の外部シンボル_imp_midiOutReset@4が関数_mainで参照されました。
LNK2019は,MSDNライブラリにあるような状況の他,インポートライブラリをリンクしていない場合にも発生します。
そして,例えば
midiOutOpen APIのMSDNライブラリの記述を見ると,
Requirements
Library Winmm.lib
との表記があります。
これは,Winmm.libをリンクする必要がある,ということです。
オフトピック
その上のHeader欄にはMmsystem.h (include Windows.h)とあるため,Windows.hをインクルードしたなら明示的にMmsystem.hをインクルードする必要はない,ということもわかります。
さて,VC++2015におけるライブラリのリンクの方法ですが,
リンカー入力としての .lib ファイルに記述があります。
他に,#pragmaディレクティブを使う方法 (
コメント (C/C++)) があります。
単一ファイルの場合は,#pragma comment(lib, "winmm.lib")の方が楽だったりしますが,オブジェクトファイルが最終的にリンクされないと,
この#pragmaディレクティブも適用されないため,複数ファイルの場合は注意して使う必要があります。
Re: MIDIプログラミングやりたいんだが
Posted: 2015年11月05日(木) 07:56
by Kazuya
YuOさん
細かいところまで説明して頂き感謝です!
YuOさんの言われたとおり、Winmm.libのリンクを試してみたいと思います、また解決できましたらお知らせいたします。
本当にありがとうございます。
Re: MIDIプログラミングやりたいんだが
Posted: 2015年11月05日(木) 08:20
by Kazuya
Winmm.libのリンクを通してみました。
エラーがなくなった!・・・と思ったのですがまた2つエラーが発生してしまいました。次のようなエラーです(プログラム自体は最初と同じものを実行しています。)
LNK 1120 1件の未解決の外部参照
LNK 2019 未解決の外部シンボル_WinMain@16が関数"int__cdecl invoke_main(void)" (?
invoke_main@@YAHXZ)で参照されました。
Re: MIDIプログラミングやりたいんだが
Posted: 2015年11月05日(木) 13:00
by YuO
Kazuya さんが書きました:LNK 2019 未解決の外部シンボル_WinMain@16が関数"int__cdecl invoke_main(void)" (?
invoke_main@@YAHXZ)で参照されました。
コンソールアプリケーションでないWindowsアプリケーションにおいて,エントリポイントは基本的に
WinMain (またはwWinMain) であって,main (またはwmain) ではありません。
オフトピック
/ENTRYリンカオプションでエントリポイントは変更できますが,へたに変更するとCRT等の初期化すら行われないため,通常の用途では利用できません。
コンソールアプリケーションでないWindowsアプリケーションでは,
ではなく,
コード:
int CALLBACK WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
から始めるようにしてください。
Re: MIDIプログラミングやりたいんだが
Posted: 2015年11月05日(木) 13:22
by Kazuya
とんでもなく基本的な部分だったんですね(-_-;)
今までコンソールアプリケーションしか使ったことがなかったので、Windowsアプリケーションでの使い方としてとても勉強になりました!
結果、エラーが無くなり実行できました!!本当にありがとうございます!