• 締切済み

CygwinからVisual C++へ

Cygwinでコンパイルしていたプログラムを、 Visual C++の cl コマンドでコンパイルしたいです。 あるプログラムを書きまして、Cygwinをインストールし、 [block.rc] BLOCKS BITMAP "block.bmp" という内容のリソースファイルを作成して、 windres block.rc -o block.o gcc -mwindows aaa.cpp block.o でちゃんとコンパイルできていました。 上記のように Visual Studio 2010 のVisual C++でコンパイルするにはどうしたらいいのかわかりません。 cl aaa.cpp block.o とやっても cl -mwindows aaa.cpp block.o とやっても、コンパイルできませんでした。 -mwindowsに代わるclコマンドのオプションを探してはみてみたものの、 -GA windowsアプリケーション用の最適化を行う というものを見つけたのでやってみましたがだめでした。 どなたか、コンパイルのアドバイスを下さい。

みんなの回答

回答No.3

>error LNK2019: 未解決の外部シンボル ・・・ ライブラリを指定してやらなければならないです。 google とかで "msdn BitBlt" のようにキーワードを指定して検索すると MSDN のリファレンスのページが見つかると思うので、そこで一番下の方にあるインポートライブラリを指定しましょう。 cl aaa.c block.res kernel32.lib gdi32.lib ... のようにしてやれば良いと思います。 # /link オプションを指定しなくても勝手に上手くやってくれるみたいですね。

Klaviermann
質問者

お礼

おっしゃる通りにやってみたところ、 無事コンパイルできました。 ありがとうございました!

回答No.2

CL コマンドではリソースのコンパイルはできないと思います。 ( RC コマンドでリソースファイルのコンパイルが可能です。) windres、または rc で block.res を出力して、 cl aaa.cpp /link aaa.obj block.res ... のようにすれば exe ができるんじゃないかなぁ、と思います。

Klaviermann
質問者

お礼

ライブラリの指定が足りなかったようです。 kernel32.libやUser32.libなどを指定したら、 無事にコンパイルできました。 ありがとうございました!

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

スタートメニューから「Microsoft Visual Studio 2010」→「Visual Studio Tools」→「Visual Studio 2010 コマンド プロンプト」を選んでそこから「cl」を起動するとどうなりますか?

Klaviermann
質問者

補足

Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. 使い方: cl [ オプション... ] ファイル名... [ /link リンク オプション... ] とでます。 NO2の質問者の方のように、block.resファイルを生成し、 >cl tetoris0113.cpp block.res とやったら、 /out:tetoris0113.exe tetoris.obj block.res tetoris0113.obj : error LNK2019: 未解決の外部シンボル __imp__BitBlt@36 が関数 "v oid __cdecl showBoard(void)" (?showBoard@@YAXXZ) で参照されました。 tetoris0113.obj : error LNK2019: 未解決の外部シンボル __imp__GetAsyncKeyState@4 が関数 "bool __cdecl processInput(void)" (?processInput@@YA_NXZ) で参照されまし た。 tetoris0113.obj : error LNK2019: 未解決の外部シンボル __imp__InvalidateRect@12 が関数 "void __cdecl gameOver(void)" (?gameOver@@YAXXZ) で参照されました。 tetoris0113.obj : error LNK2019: 未解決の外部シンボル __imp__KillTimer@8 が関数 "void __cdecl gameOver(void)" (?gameOver@@YAXXZ) で参照されました。 tetoris0113.obj : error LNK2019: 未解決の外部シンボル __imp__DefWindowProcA@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 tetoris0113.obj : error LNK2019: 未解決の外部シンボル __imp__PostQuitMessage@4 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 tetoris0113.obj : error LNK2019: 未解決の外部シンボル __imp__DeleteObject@4 が関 数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?Wn dProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 tetoris0113.obj : error LNK2019: 未解決の外部シンボル __imp__EndPaint@8 が関数 " long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndPro c@@YGJPAUHWND__@@IIJ@Z) で参照されました。 tetoris0113.obj : error LNK2019: 未解決の外部シンボル __imp__BeginPaint@8 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndP roc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 このように、よくわからないエラーがたくさん出ます。 gccでの-mwindowsオプションのように WINDOWSアプリケーション用のオプションが必要なのでしょうか?