• ベストアンサー

VC++(VS)でコンソールアプリ(複数ファイルからなる)を作成したい

マイクロソフト社のVC++(Visual Studio 2008)で コンソールアプリケーションを作成しようとしております。 ファイルは複数ファイルからなり、 mainprogram.cpp -> 実行ファイル(mainprogram.exe) subprogram1.cpp -> オブジェクトファイル(subprogram1.obj) subprogram2.cpp -> オブジェクトファイル(subprogram2.obj) ・・・以下続く のように 1)サブプログラムをobjファイルとしてコンパイル 2)メインプログラムをコンパイルしてobjファイルとリンクし、   実行ファイルを作成する というような作業を行いたいと考えております。 以前はLinuxの環境でg++、makeを利用して このような構成のコンソールアプリケーションを作成しておりました。 が、VCに移行するに当り、どのようにプロジェクトファイル等を 構成して良いか分からず、出だしでつまづいております。 VCにもコマンドラインでコンパイルする方法 (cl, nmakeを使うんでしょうか。。。)があるみたいですが、 これらの手法について書かれている 書籍、サイト等を探すことが出来ないでおります。 VCに関して、このような使用法に対する解説がなされている書籍、 もしくはサイト等をお教え願えませんでしょうか? 宜しくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

http://www.soft-cc.com/Basic/MakeProject.html の ---------- 5.次にソリューションエクスプローラーの ソースファイルというフォルダを右クリックして、 [追加] → [新しい項目の追加] を選択し、C++ファイルを追加します。 追加されたファイルにプログラムを記述していきます。 ---------- を、必要なだけ繰り返します。 1回目は「mainprogram.cpp」で、2回目以降は「subprogram○.cpp」で追加して下さい。 プロジェクトをビルドすると、すべてのソースがコンパイルされ mainprogram.cpp -> オブジェクトファイル(mainprogram.obj) subprogram1.cpp -> オブジェクトファイル(subprogram1.obj) subprogram2.cpp -> オブジェクトファイル(subprogram2.obj) となり、すべてのオブジェクトファイルが無事に生成されると mainprogram.obj subprogram1.obj subprogram2.obj 上記以外の必要なライブラリ がリンカによって結合され 実行ファイル(project1.exe) が出来上がります。出来上がる実行ファイルの名前は、自動的にプロジェクト名と同じになります(この例ではプロジェクト名を「Project1」にした) 因みに >mainprogram.cpp -> 実行ファイル(mainprogram.exe) >subprogram1.cpp -> オブジェクトファイル(subprogram1.obj) >subprogram2.cpp -> オブジェクトファイル(subprogram2.obj) という解釈は誤りです。上記のように mainprogram.cpp -> mainprogram.obj subprogram1.cpp -> subprogram1.obj subprogram2.cpp -> subprogram2.obj と言う段階と mainprogram.obj + subprogram1.obj + subprogram2.obj + ライブラリファイル -> project1.exe と言う段階と、2つあります。 >mainprogram.cpp -> 実行ファイル(mainprogram.exe) というように「メインプログラムがいきなり実行ファイルになる訳じゃない」ので注意しましょう。出来上がる実行ファイルも、メインプログラムのファイル名とは別の名前になります。 更に言うと、VC++(Visual Studio 2008)は、メインプログラムとサブプログラムとを区別しません。どれも平等に扱います。 どれも平等に扱うので、メインとなるソースファイルが何番目にあっても構いません。 メイン/サブの区別は、人間が勝手に「main関数があるソース」と「main関数が無く、別の関数があるソース」を区別して呼んでいるだけに過ぎません。 コンパイラは、単に「ライブラリファイルの中にあるスタートアップルーチンを実行ファイルのエントリポイントとして実行ファイルを作るだけ」です。 そして「ライブラリファイルの中にあるスタートアップルーチンに、main関数をコールしている記述がある」ので、人間の目には「main関数からプログラムが開始される」ように見えるだけです。 そして人間は「main関数からプログラムが開始されるので、それがメインだ」と思い込んでいるに過ぎません。

henapgm
質問者

お礼

どうもありがとうございます。 お礼が遅くなりすみません。 ここまで詳しく解説していただきありがとうございます。 参考どころかほとんど答えを教えていただき、 恐れ入ります。 早速試してみます。 どうもありがとうございます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

統合環境で作るなら, プロジェクトを作るときにコンソールアプリケーションを選んでおいて, 必要なファイルを全部追加すればいいだけじゃないかな. コマンドラインでコンパイルするなら, コンパイラについてはヘルプを見ながらちまちまとオプションをおきかえるだけ. むしろ GNUmake から nmake への移行の方が面倒だけど, 「普通の Makefile」なら $^ を $** に置き換えることだけ気をつければ大体コンパイラオプションの置き換えだけですむ. ただし「普通じゃない Makefile」だと修正不可能なこともあるので, その場合は Cygwin をインストールするとか頑張って Makefile を全部書き直すとかすることになる. いずれにしても, MSDN は確認した方がいいと思う.

参考URL:
http://msdn.microsoft.com/ja-jp/library/default.aspx
henapgm
質問者

お礼

早速ありがとうございます。 お礼が遅くなりましてすみません。 なるほど、やはり面倒くさがらずにヘルプを読みながら、 というのが基本なのですね。 MSDNも新しい関数の使い方なんかを知るためには 見たりしてたのですが、 ちゃんと探すと今回のケースのような情報も載っているんですね。 どうもありがとうございました。

関連するQ&A

  • VC++コンソールアプリでのインスタンスハンドルの取得

    VC++コンソールアプリでのインスタンスハンドルの取得 VC++コンソールアプリケーションでインスタンスハンドルを取得しようとしているのですが、 HINSTANCE hi = (HINSTANCE)GetWindowLong(HWND_DESKTOP, GWL_HINSTANCE); を実行すると、NULLが戻ってきます。 どこかまずい部分があるのでしょうか。 なお、第一引数のウィンドウハンドルは不明なため、 いくつかのWebサイトに習い、HWND_DESKTOPを指定しました。

  • VC2005で作成したDLLファイルをVC2008で動的リンク(LoadLibrary)する方法

    「VC2005 Standard Edition」で作成したDLLファイルを、 「VC2008 Express Edition」で作成したコンソールアプリケーション から、LoadLibrary("VC2005で作成したDLLファイル")すると 失敗してしまいます。 GetLastErrorでエラーを取得すると、"36B1"が表示されます。 (このエラーは何か調べても見つかりませんでした) 何が原因かご存知の方がいらっしゃいましたら、 ご教授頂けませんでしょうか。

  • C++Builderで実行ファイルが作成されない

     C++Builder6で本に載っているHelloWorldサンプルをビルドしたところ、真っ白なタブが出るだけで何も出力されません。Bin下のbcc32でコマンドラインからコンパイルしてみると、objファイルとtdsファイルが出来ていますが、exeファイルは作成されていませんでした。  どうやれば簡単なコンソールアプリケーションをビルドできるのでしょうか?

  • 複数ファイルによる共通の外部変数定義について

    初歩的な質問なのですが、今各関数をファイルごとに分けて記述しようとしています。 ここで詰まっているのでできればご教授お願いします ファイル構成は プログラムファイル main.cpp sub.cpp ヘッダーファイル  myheader.h(main.cppとsub.cpp両方でインクルード) ヘッダーファイルには両方のプログラムファイルで使う変数が定義してあります。 それでmain.cppとsub.cpp両方で同じ変数を使いたいのですがコンパイルエラーが発生してしまいます。 内容はsub.obj側で「i(共通のループカウンタ)はmain.objですでに定義されています」というものです。 とにかく私のやりたいことはヘッダーに外部変数を定義して両方のプログラムファイルで使いたいというものです。 もしかしたらファイルを分けるにも何か設定が必要なのでしょうか? 私はただ[プロジェクト]→[プロジェクトに追加]→[新規作成]でソースファイルを作っているだけなんですが・・・ 上記の状態を回避する方法はあるのでしょうか?

  • VC++  Windowsアプリケーション作成

    【VC++ 2005 ExpressEdition】使用 ●今回、上記の環境を用いて簡単なWindows用ツールでも作成しようと思っております。  実際起動し、新しいプロジェクトの開始で、Windowsフォームアプリケーションを選択したのですが、初めから様々なcppファイルやらヘッダファイルがあり、プログラムもすでに大量に書かれていてどこにWinMainがあり、どこから書いていけばよいのか分かりません。 試しにボタンをフォームデザインで作成し、ダブルクリックによりイベントを作成してみたのですが、 private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) このような文が表示されました。 過去にBolandの開発環境を使い1からウィンドウを作成したことがあり、BN_CLICKEDなどのメッセージが使われるのだろうと思っていたのですが全く意味が分かりませんでした。参考書やサイトに書いてあるプログラムもどこに書いてよいのか分かりません。 VC++でのWindowsアプリケーションの作成時の使い方をどなかた教えていただけないでしょうか。 尚、VC#、VBでのWindowsアプリケーション作成、C++でのWinAPIについては、かじった程度の経験はあります。

  • VC、コンソールアプリ結果のウインドウサイズ

    OSはwindows2000proSP2、VC6スタンダードで コンソールアプリケーションを作っています。 アプリを実行すると、結果がコマンドプロンプトに出てきますが、 コマンドプロンプトのウインドウサイズ幅が小さく、 変なところで折り返って表示されてしまい、見栄えが悪くなってしまいます。 そこで、実行結果が出力されるコマンドプロンプトのウインドウサイズを 変更したいのですが、どう設定したらよいかわかりません。 どうしたらウインドウサイズを変更できるのでしょうか?

  • WinXpのVC++6.0で作成した実行ファイル

    MFCで作成した実行ファイルについて質問します。 WindowsXpのVC++6.0で作成した実行ファイルを、Windows7で正常に動作しますか? 質問の背景:私の場合、『WindowsXpのVC++6.0で作成した実行ファイル』を Windows7で実行した場合には、正常に動作しない様です。 この件に関しまして、コメント頂けますと大変助かります。

  • VC実行ファイルについて

    VC++でコンパイルした実行ファイルをVC++がインストールされていないパソコンで動作させるとプッシュボタン等すべてのコントロールが表示されません。 後、mfc42d.dll、mfcvrtd.dllが無いと起動もできません。 コンパイル時に必要なdllやocxを実行ファイルにリンクさせて、他のパソコンで動作させる時には実行ファイルだけインストールすれば動作するようにすることは出来ないのでしょうか? わかる方おりましたら よろしくお願い致します。

  • BCBで作成したDLLを、VC++で静的リンクさせる方法

    BCBで作成したDLLを、VC++で静的リンクさせる方法 Borland C++ Builderで作成したDLLを、VC++アプリケーションで利用できるように LIBファイルに変換したいのですが、上手くいきません。 下記の手順を踏みました。 1. BCBでDLL作成   「VC++スタイルのDLL」で作成、   「VCLを使う」「CLXを使う」「マルチスレッドを使う」はチェックせず 2. コマンドラインで「IMPDEF.exe」を使用して、dllからdefファイル作成   (IMPDEF.exeは、\Borland\CBuilder6\Binに格納されていた) 3. コマンドラインで「LINK.exe」「LIB.exe」を使用して、defからlibファイル作成   (LINK.exeとLIB.exeは、\Microsoft Visual Studio\VC98\Binに格納されていた) 4. VC++プロジェクトファイルを保存したフォルダに、DLLファイルとlibファイルをコピー 5. VC++の「プロジェクト」-「設定」-「リンク」-「オブジェクト/ライブラリモジュール」に   作成したlibファイルを追加 VC++プロジェクトをビルドすると、下記のエラーメッセージが表示されます。 ///////////////////////////////////////////////////////////////////////////////// dllread.obj : error LNK2001: 外部シンボル "__imp__(関数名)@0" は未解決です LIBC.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Release/dllread.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー ///////////////////////////////////////////////////////////////////////////////// BCBとVC++のバージョンは、下記の通りです。 BCB Professional 6.0 VC++ 6.0 ちなみに、同じDLLを動的リンクで利用することは出来ました。 初心者の質問で申し訳ございませんが、解決策が分かる方がいらっしゃいましたら 教えていただけないでしょうか?

  • Windows7のコマンドラインでのnmake

    標題のようにWindows7のコマンドラインでnmakeを利用したいと思います。ソースプログラムを作成してコンパイルするということが基本だと思っています。 例えば、wave.fというフォートランのソースをgfortranでコンパイルしてwave.oというオブジェクトファイルを作成し、wave.exeを生成するというような動作をmakefileで実行する実験をしているのですが、エラーとなります。 ○ 以下に test.mak というmakefileを作成しました。いろんなサンプルファイルを参考にしてこのような動作かなと思って作成しました。右の←以下は私はこういうつもりで書いたというものです。 FC = gfortran          ←コンパイラ FFLAGS = -Wall ←オプション objects=wave.o         ←オブジェクト名 # wave: $(objects) $(FC) $(FFLAGS) $(objects) -o wave←コンパイル # wave: $(objects) ← オブジェクトファイルを集めて実行ファイルを作成する。 # clean :       ← はじめからやり直すためにオブジェクトファイルを削除する(クリーンにする)。 rm *.o    ← 削除 ○実行 nmake test.mak あるいは nmake -f test.mak などです。 結果は、NMAKE: fatal error U1073: 'wave.o'のビルドの方法が指定されていません。stop. gfortran -Wall wave.o -o wave というところが、オブジェクトファイルwave.oを使って実行ファイルwaveを作成するという意味なので、wave.fというファイルを探しだしてコンパイルしてwave-oを生成する、という筋書きになっていると思っていました。 昔からmakeが苦手なのでちょっと時間を取って考えているところです。 test.makのどこが間違っているのでしょうか。添削をお願いしたいのですが。 よろしくお願いします。Cのカテゴリの方も十分ご存知かと思ったのでこちらに書きました。

専門家に質問してみよう