2

Visual C ++ 2005でリリースビルドを使用しようとしたのはこれが初めてであり、確かにいくつかの違いがあるようです。

私の現在のエラーは次のとおりです。

Unhandled exception at 0x6ef7d628 (msvcr80d.dll) in <program_name>: 
0xC0000005: Access violation reading location 0x6c2e6769.

呼び出しスタックを調べたところ、作成した静的ライブラリの関数に渡された文字列が「Bad Ptr」を与えていることがわかりましたが、その理由はわかりません。デバッグビルドでは問題なく動作します...

問題の行は次のとおりです。

int main()
{
    static Script luaScript("config.lua");

Scriptは、luaスクリプトファイルを処理するために作成したクラスです。すべてのコードがアクセスできるようにシングルトンにしたいので、静的です。

スクリプトコンストラクター:

Script::Script(const string &filename)
{
    luaState = lua_open();
    scriptFilename = filename; // unhandled exception occurs here; Intellisense     
                               // identifies filename as a <Bad Ptr>
                               // works perfectly fine in debug

}

ライブラリもデバッグモードになっているせいかもしれませんが、Releaseを使おうとするとコンパイルできないようです。

fatal error C1010: unexpected end of file while looking for precompiled header. 
Did you forget to add '#include "stdafx.h"' to your source?

私はそのファイルにある程度精通していますが、静的ライブラリのリリースビルドになぜそれが必要なのですか?デバッグでそれを要求しませんでした。

OK、stdafx.hファイルを取得してください...新しいエラーが到着しました!:

fatal error C1083: Cannot open precompiled header file: 
'Release\Script.pch': No such file or directory

ええと、「Visual C ++ 2005がリリースビルドのために私に何をしてほしいのか!?」以外のこれらすべての中心的な質問を見つけるのはちょっと難しいです。

誰かが助けてくれることを願っています。ありがとうございました。

4

2 に答える 2

1

修正する一番の方法Cannot open precompiled header file"は、すべてをクリーンアップ/再構築することです。
その後、リリース ビルドとデバッグ ビルドの違いから始めます。プロジェクト ファイルを開くか、Visual Studio 内からプロジェクト設定を比較します。
Bad Ptr の問題を心配する前に、ライブラリをビルドしてリリースしてください。それを乗り越えれば、Bad Ptr の問題は解消される可能性が非常に高いです。
それ以外の場合は、std::string ではなく char[] を渡していることがわかります。特に問題はないと思いますが、やってみます

string filename = "config.lua";
static Script luaScript(filename);

私が言及した他のすべてを試した後。

于 2011-07-09T19:32:18.077 に答える
-1

シングルトンと静的初期化の順序について:

静的初期化の大失敗

悲劇は、50%-50% の確率で死ぬことです。

修正方法は?

この問題には多くの解決策がありますが、非常に単純で完全に移植可能な解決策は、グローバル Fred オブジェクト x を参照によって Fred オブジェクトを返すグローバル関数 x() に置き換えることです。

// File x.cpp

#include "Fred.h"

Fred& x()
{
    static Fred ans;
    return ans;
}
于 2011-07-09T20:13:00.350 に答える