プロが教える店舗&オフィスのセキュリティ対策術

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アプリケーション用の最適化を行う
というものを見つけたのでやってみましたがだめでした。

どなたか、コンパイルのアドバイスを下さい。

A 回答 (3件)

>error LNK2019: 未解決の外部シンボル ・・・



ライブラリを指定してやらなければならないです。

google とかで "msdn BitBlt" のようにキーワードを指定して検索すると
MSDN のリファレンスのページが見つかると思うので、そこで一番下の方にあるインポートライブラリを指定しましょう。

cl aaa.c block.res kernel32.lib gdi32.lib ...

のようにしてやれば良いと思います。


# /link オプションを指定しなくても勝手に上手くやってくれるみたいですね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/04/11 22:13

CL コマンドではリソースのコンパイルはできないと思います。


( RC コマンドでリソースファイルのコンパイルが可能です。)

windres、または rc で block.res を出力して、

cl aaa.cpp /link aaa.obj block.res ...

のようにすれば exe ができるんじゃないかなぁ、と思います。
    • good
    • 0
この回答へのお礼

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

ありがとうございました!

お礼日時:2011/04/11 22:12

スタートメニューから「Microsoft Visual Studio 2010」→「Visual Studio Tools」→「V

io 2010 コマンド プロンプト」を選んでそこから「cl」を起動するとどうなりますか?

この回答への補足

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アプリケーション用のオプションが必要なのでしょうか?

補足日時:2011/04/10 15:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!