Windows7の下、
Visual Studio 2005 VC++
で使用しています。
ファイルを開いたり、
そこに録音したりするのに、
下記のように、
MCI命令を使っています。
mciSendCommand(0 , MCI_OPEN ,
MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID |
MCI_OPEN_ELEMENT , (DWORD)&mop);
mciSendCommand(mop.wDeviceID , MCI_RECORD , 0 , 0);
ところが、コンパイルする時に、
下記のように、リンク時に、
それらの命令が_WndProc@1下のコードでは、
見つからないとするような
エラーが出ました。
何が悪いのでしょうか?
何か、リンクするとか、そういう作業が必要なのでしょうか?
教えていただけると、ありがたいです。
よろしくお願いします。
1>リソースをコンパイルしています...
1>マニフェストをリソースにコンパイルしています...
1>リンクしています...
1>Rec.obj : error LNK2019: 未解決の外部シンボル __imp__mciGetErrorStringA@12 が
関数 _WndProc@16 で参照されました。
1>Rec.obj : error LNK2019: 未解決の外部シンボル __imp__mciSendCommandA@16 が関
数 _WndProc@16 で参照されました。
1>Debug\Real_Vowel_Rec.exe : fatal error LNK1120: 外部参照 2 が未解決です。
1>ビルドログは file://c:\Real_Vowel_Rec\Debug\BuildLog.htm に保存されました。
1>Real_Vowel_Rec - エラー 3、警告 10
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========
>1>リンクしています...
>1>Rec.obj : error LNK2019: 未解決の外部シンボル __imp__mciGetErrorStringA@12
が
>関数 _WndProc@16 で参照されました。
>1>Rec.obj : error LNK2019: 未解決の外部シンボル __imp__mciSendCommandA@16 が関
数 _WndProc@16 で参照されました。
>1>Debug\Real_Vowel_Rec.exe : fatal error LNK1120: 外部参照 2 が未解決です。
これは、リンク時のエラーメッセージですから、リンカーに対するリンク対象の
指定が足りないためにリンカーが探しきれなかったと報告しているのでしょう。
リンクすべきライブラリーかインポートの指示かを見直してみてください
http://msdn.microsoft.com/ja-jp/library/cc410493.aspx
下の方に「インポートライブラリ」として、リンクに必要なライブラリが書かれています。
リンカで指定していますか?
# 標準では指定されていないと思いますが…。
リンカではなく、pragmaで指定してもいいんですけどね。
#pragma comment(lib, winmm.lib)
のように。
皆さん
いろいろと、
ご教示、
ありがとうございます。
でも、
#include <mmsystem.h>
した直後に、
今しがた、
#pragma comment(lib, winmm.lib)
を入れてみたのですが、
やはり、コンパイルは通れど、
mci命令で引っかかるという
状況は変わりませんでした。
mmsystemのスペルをMmsystem
にしてみたり、
winmmを
Winmm
にしてみたりもしましたが、
前と同じでした。
(プロジェクトは、Windowsのモードで作っています)
winmm以外に、
他にリンクすべきものがあるのでしょうか?
また、ちなみに、プログラムの中以外で、
VS++2005 c/c++
では、どこに、winmmをリンクすべきメニューがあるのでしょうか?
>やはり、コンパイルは通れど、
>mci命令で引っかかるという
>状況は変わりませんでした。
エラーメッセージは変わらない…ということですか?
まさかSDKへのパスが通っていない…というワケではないと思いますけど……。
# 確認方法は後述。
「リビルド」でまっさらからコンパイルし直してみる…とか。(とは言え、ソース書き換え
た時点でコンパイル対象になっているハズですけどねぇ…)
>また、ちなみに、プログラムの中以外で、
>VS++2005 c/c++
>では、どこに、winmmをリンクすべきメニューがあるのでしょうか?
自宅帰らないと2005がないのですが…とりあえず2008で。
# それほど違いは無かった…ハズ。
なお、設定は「上級者」設定前提となります。
まずはライブラリパスの確認。
[ツール][オプション]でオプションの画面を開いて、
左側のツリービューで[プロジェクトおよびソリューション][VC++ ディレクトリ]と進み
ます。
プラットフォームは「Win32」のまま、ディレクトリを表示するプロジェクトで「ライブ
ラリ ファイル」を選択。
下の一覧に「$(WindowsSdkDir)\lib」ってのは入っていますか?
入っていないとWindowsSDKのインストールが正しくない可能性があります。
# まぁ、それだと…コンパイルの時点でエラーになると思うんですけどねぇ…。
んで、個別のライブラリファイルの指定。
[プロジェクト][~のプロパティ]でプロジェクトのプロパティページが開きます。
「構成」から「Debug」か「Release」を選択して、下のツリービューから
[構成プロパティ][リンカ][入力]と進みます。
右側に「追加の依存ファイル」という欄があるので、クリックしてアクティブにすると右
の方に[...]ってボタンが出ます。
[...]のボタンを押すと新しくウィンドウが開くので、上のエディットボックスに
winmm.libと入力してください。
既に何か入力されている場合は改行して下に追加し、[OK]ボタンで閉じます。
プロジェクトのプロパティページも[OK]で閉じてください。
で……この設定はDebugとReleaseで別々に設定されるのでもう片方への設定も忘れずに。
追試しました。VS2008ですが、
#include <mmsystem.h>
#pragma comment(lib, winmm.lib)
void foo()
{
LPMCI_OPEN_PARMS OpenPrm;
MCIERROR err = mciSendCommandA( // (Wも)
NULL,
MCI_OPEN, MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT, ( DWORD)
&OpenPrm);
}
でリンクエラーは出ませんでした。
>マニフェストをリソースにコンパイルしています...
これ大丈夫でしたっけ?
バージョン違いがあったように思えます。