ビルドとコンパイルは何がちがうのでしょうか。
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

ビルドとコンパイルは何がちがうのでしょうか。

2017-10-27 16:36




    マックス 「NOWいプログラムが記述されているじゃないか?

    以下は画面内に記述されているC++言語のソースコードです

    // WindowsProject2.cpp: アプリケーションのエントリ ポイントを定義します。
    //

    #include "stdafx.h"
    #include "WindowsProject2.h"

    #define MAX_LOADSTRING 100

    // グローバル変数:
    HINSTANCE hInst; // 現在のインターフェイス
    WCHAR szTitle[MAX_LOADSTRING]; // タイトル バーのテキスト
    WCHAR szWindowClass[MAX_LOADSTRING]; // メイン ウィンドウ クラス名

    // このコード モジュールに含まれる関数の宣言を転送します:
    ATOM MyRegisterClass(HINSTANCE hInstance);
    BOOL InitInstance(HINSTANCE, int);
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

    int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR lpCmdLine,
    _In_ int nCmdShow)
    {
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);

    // TODO: ここにコードを挿入してください。

    // グローバル文字列を初期化しています。
    LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadStringW(hInstance, IDC_WINDOWSPROJECT2, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);

    // アプリケーションの初期化を実行します:
    if (!InitInstance (hInstance, nCmdShow))
    {
    return FALSE;
    }

    HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT2));

    MSG msg;

    // メイン メッセージ ループ:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }

    return (int) msg.wParam;
    }


    //
    // 関数: MyRegisterClass()
    //
    // 目的: ウィンドウ クラスを登録します。
    //
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWSPROJECT2));
    wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT2);
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
    }

    //
    // 関数: InitInstance(HINSTANCE, int)
    //
    // 目的: インスタンス ハンドルを保存して、メイン ウィンドウを作成します。
    //
    // コメント:
    //
    // この関数で、グローバル変数でインスタンス ハンドルを保存し、
    // メイン プログラム ウィンドウを作成および表示します。
    //
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
    hInst = hInstance; // グローバル変数にインスタンス処理を格納します。

    HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);

    if (!hWnd)
    {
    return FALSE;
    }

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    return TRUE;
    }

    //
    // 関数: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    // 目的: メイン ウィンドウのメッセージを処理します。
    //
    // WM_COMMAND - アプリケーション メニューの処理
    // WM_PAINT - メイン ウィンドウの描画
    // WM_DESTROY - 中止メッセージを表示して戻る
    //
    //
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message)
    {
    case WM_COMMAND:
    {
    int wmId = LOWORD(wParam);
    // 選択されたメニューの解析:
    switch (wmId)
    {
    case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    }
    break;
    case WM_PAINT:
    {
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);
    // TODO: HDC を使用する描画コードをここに追加してください...
    EndPaint(hWnd, &ps);
    }
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }

    // バージョン情報ボックスのメッセージ ハンドラーです。
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
    return (INT_PTR)TRUE;

    case WM_COMMAND:
    if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
    {
    EndDialog(hDlg, LOWORD(wParam));
    return (INT_PTR)TRUE;
    }
    break;
    }
    return (INT_PTR)FALSE;
    }


    マックス「これがプログラミング言語C++というわけか

    意味は分からないけど

    なんか かっこいいな

    どうやら サンプルプログラムみたいじゃないか?

    ここからC言語のプログラムをうちこんでいくのか?」

    ソーラー「とりあえず サンプルプログラムを消して

    #include <stdio.h>

    int main(void)
    {
    printf("Hello, world\n");
    return 0;
    }

    とうちこんでみます。




    ソーラー「うまくかきこめたね。

    あとは このプログラムをコンパイルしてプログラムを実行するするだけなんだけど・・

    どうもそのコンパイルにあたる プログラムを実行するボタンがない・・・

    ???
    とりあえず なにか押してみよう」

    マックス「このビルドってボタンをおしてみるか

    位置的にもそれらしいじゃないか





    ソーラー「ビルドっていう言葉を調べてみると・・

    ビルドとは・・・

    ソースコードは人間にとって分かりやすいプログラミング言語で記述されています

    ソースコードをコンパイルすると

    ソースコードはコンピュータに理解できる0と1のみで記述された機械語に翻訳され

    その機械語の命令をコンピュータは実行までがおこなわれます

    (これはコンパイルの正式な説明ではありません。

    詳しくは天国にいけるC言語入門のエピソード

    https://kakuyomu.jp/works/1177354054881541503/episodes/1177354054884436942

    をご覧ください



    ビルドすると

    このソースコードはコンピュータに理解できる0と1のみで記述された機械語に翻訳する

    ところまでがおこなわれます

    ですのでビルドしただけでは

    プログラムは実行されません

    なるほど なるほど

    そんな意味だったんだね」

    マックス「ビルドって本格的な感じだな・・

    Visual Studioではそんな機能があるのか・・・」


    ソーラー「よ~し

    ビルドボタンを押してみる。

    さらに小ウインドウがでてきたね

    その中の一番上の項目である

    ソリューションのビルドを選んでクリックすると・・・





    ソーラー「? 何も変化なし

    ???」

    マックス「下の方になにか表示されているぞ





    エラー C1010 プリコンパイル ヘッダーを検索中に不明な EOF が見つかりました。'#include "stdafx.h"' をソースに追加しましたか? WindowsProject2 c:\users\solarplexuss\source\repos\windowsproject2\windowsproject2\windowsproject2.cpp 8

    ソーラー「'#include "stdafx.h"' をソースに追加しましたか?

    どこかでみたような文章だね(笑)

    #include "stdafx.h"

    C言語の

    #include <stdio.h>に

    そっくりさんだね。

    多分C++言語でプログラムを作製するとき

    プログラムの冒頭で

    この

    #include "stdafx.h"

    を記述しないといけないみたいだね。

    つまりこのプログラムでは

    C言語の

    #include <stdio.h>

    にあたる

    #include "stdafx.h"が記述されていません

    ってエラー文が出てるみたい」

    マックス「ということはVisual Studioは

    俺たちがC言語ではなくC++言語でプログラムを記述していると

    思ってるんじゃないか」

    ソーラー「ははっ そのようです

    C++言語ではC言語も使える仕様になってるといっても

    そのままでは C言語を使ってプログラムを作製することができないみたいだね」

    (後のエピソードを見ていただければお分かりになられますが

    実はC++言語ではC言語をそのままかきこんでも使用できる仕様となっています。


    ですが この例をみてもお分かりになられますように

    C言語をそのままかきこんでもエラーが出る場合があります

    それは
    作製したプログラムを格納する新規プロジェクトの作製において

    Windowsコンソールアプリケーション

    Windowsデスクトップアプリケーション

    空のプロジェクト

    から

    Windowsデスクトップアプリケーションを選択したからなのです)



















    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。