4

Visual Studio 2012 Express(もちろんデスクトップ用)で空のC ++プロジェクトを作成し、ランダムな基本コードを追加しました。

#include <cstdio>
#include <cstdlib>

typedef struct examplestruct
{
    unsigned char num1;
    unsigned short num2;
    unsigned long num3;
    unsigned long long num4;
} EXAMPLESTRUCT;

void examplefunction(unsigned long *num, int num2)
{
    *num += num2;
    return;
}

int main(int nArgs, char **pszArgs)
{
    EXAMPLESTRUCT ExStructInstance = {0xFF, 0xFFFF, 0xFFFFFFFF, 0xFFFFFFFFFFFFFFFF};
    printf("%d, %d, %u, %ull\n", ExStructInstance.num1, ExStructInstance.num2, ExStructInstance.num3, ExStructInstance.num4);
    unsigned long num5 = ExStructInstance.num1 + ExStructInstance.num2;
    printf("%d\n", num5);
    examplefunction(&num5, 10);
    printf("%d\n", num5);
    system("pause");
    return 0;
}

(これが一体何なのか疑問に思っている場合は、作成した実行可能ファイルを逆アセンブルして、最適化コンパイラの動作を観察し、x86アセンブリについて詳しく学習します。)

プロジェクト設定の[リンカー]でMulti-threaded (/MT)、ランタイムライブラリを選択したので、静的にリンクします。

コンパイルしてF5でデバッグを開始したところ、すぐにメッセージボックスに次のエラーが表示されました。

ランタイムエラー!

プログラム:C:\ Users \ xxxxx \ Documents \ P .. ..

R6030

  • CRTが初期化されていません

したがって、この基本的なプログラムは、ランタイムライブラリに問題があるために実行されません。これは、私には理解できません。

何か案は?ここで何が起こっているのか知りたいのですが。前もって感謝します!

編集:参考までに、これはすべてリリースモードで行われます。

4

2 に答える 2

2

「空のプロジェクト」テンプレートを使用して新しいプロジェクトを開始すると、問題を引き起こすコツがあります。プログラムが通常のエントリポイントであるCRT起動関数ではなくmain()メソッドで起動するようにする別のプロジェクト設定を変更した可能性があります。これはCRTを初期化し、次にmain()を呼び出します。特にリンカー設定を変更して/MTを取得する場合は、どのように実行したかを推測するのは困難です。これはコンパイラの設定です。

代わりにWin32+Win2コンソールアプリケーションプロジェクトテンプレートを使用して、成功の落とし穴に陥ります。上部のを除いて、事前に生成されたコードを削除し#include <stdafx.h> lineます。少なくとも、問題の解決に役立つ出発点が得られます。また、「Helloworld」プログラムをスキップしないでください。

于 2012-10-20T13:08:56.157 に答える
1

私は問題を修正しました、そしてそれは私の側のせいです。

mainリンカー設定でエントリポイントを明示的に設定しましたが、デフォルトのままにしておく必要がありました。

CRTを使用するコンソールプログラムには、実際には、と呼ばれるエントリポイントがあります。これは_mainCRTStartup、プログラムのmain関数を呼び出す前にCRTを初期化します。これは、ほとんど「疑似エントリポイント」です。

リンカ設定でエントリポイントを自分で設定した場合、_mainCRTStartupは呼び出されないため、CRTが初期化されることはありません。プログラムはから始まり、mainCRT機能を実行できません。

明示的に定義されたエントリポイントを削除するだけで、すべてが機能しました。

あなたは毎日何か新しいことを学びます。

于 2012-10-20T13:08:47.230 に答える