VS2008内部コンパイラエラー
-
06-07-2019 - |
質問
MSVC6からMSVC 2008に切り替えようとすると、一貫して内部コンパイラエラーが発生します。プログラムのさまざまな部分をコメントアウトして多くの作業を行った後、エラーを2つの異なるCPPファイルの2行のコードにトレースしました。これらのCPPファイルはどちらも正常にコンパイルされますが、エラーが他のファイルに現れるかどうかに何らかの影響を及ぼします。
これらの行の両方には、いくつかの複雑なネストされたテンプレートのインスタンス化が含まれます。また、テンプレートクラスの1つとして抽象クラスを使用するアプリ内の唯一の場所であるように見えます。そうは言っても、この問題が抽象クラスまたはテンプレートのいずれかに関係していることは確かではありません。これは、私が気づいた最も明白なことです。これらの行が重要であることを確信することすらできません。ただし、次のようになります。
m_phDSAttributes = new SObjDict<RWCString, SIDataSource>(&RWCString::hash);
したがって、テンプレート化された辞書クラスであるSObjDict、抽象インターフェイスであるSIDataSourceがあり、パラメーターはRWCStringの静的メンバー関数へのポインターです。
コードをいじってみましたが、CPPファイル間でエラーが発生することがあります(たとえば、 class
の使用からテンプレート宣言の束を変更しました typename
)に変更しますが、韻や理由を見つけることができません。
この問題をさらにデバッグする方法については迷っています。コンパイラによって出力される正確なエラー(ソースファイルの名前を変更)は以下のとおりです。インターネット上のどこにも言及されていません。どのように進めるかについてのアドバイスを求めて、私はかなり必死です。誰かが「ああ、XYZをやるだけだ」と言うことは期待していませんが、この種の問題をデバッグする方法についてのポインタは大歓迎です。
1>d:\Dev\webapi.cpp : fatal error C1001: An internal error has occurred in the compiler.
1>(compiler file 'f:\dd\vctools\compiler\utc\src\p2\p2symtab.c', line 5905)
解決
自分の質問に答えを入れてそれを受け入れるのは少し気分が悪いのですが、それは正しいことだと思います...少なくとも一時的に問題を解決しました。トリックはプリコンパイル済みヘッダーを無効にするようです。問題を解決する理由はわかりませんが、影響を受けるプロジェクトのビルド時間が30秒未満から5分近くになったので非常に残念ですが、少なくとも前進することができます。誰かがより恒久的な解決策を思いついたら、私は喜んで彼らの答えを受け入れられたものとしてマークします。
他のヒント
p2symtab.c
がシンボルテーブルコード(の一部)であると想定するのは合理的な賭けです。これにより、アップグレードがどのようにそれを引き起こしたかがすぐに説明されます。このコードは書き直されました。 (VC6の255文字の長さの警告を覚えていますか?)
この場合、シンボルテーブルに新しいエントリはありません。したがって、シンボルテーブルでの検索が失敗する可能性があります。名前検索が発生するコンテキストが結果に影響するかどうかを確認するのは興味深いでしょう。たとえば、コードを
に変更するとどうなりますかtypedef SObjDict<RWCString, SIDataSource> SObjDict_RWCString_SIDataSource;
m_phDSAttributes = new SObjDict_RWCString_SIDataSource(&RWCString::hash);
これにより、 SObjDict_RWCString_SIDataSource
の別のシンボルテーブルエントリが強制的に作成されます。このエントリは、テンプレートへのシンボリックリンクのようなものですインスタンス化。新しい名前は、単独で検索できます(また、検索する必要があります)。
それをより小さな部分に分解し始めます。私の最初の推測は、静的関数へのポインタが問題になるだろうということです。コンストラクターで同じパラメーターを使用して、ダミーの非テンプレートクラスを作成できますか?テンプレートで抽象クラスを使用しない場合、コンパイルされますか?
間違った方向に送っているように見えますが、次のコードは2008年に正常にコンパイルされます。
class thing {
public:
static void hash( short sht ) {
}
void hash( long lng ) {
}
};
class thing2 {
public:
thing2( void (short ) ){}
};
int _tmain(int argc, _TCHAR* argv[])
{
thing2* t = new thing2( &thing::hash );
delete t;
return 0;
}
原則は変わりませんが、コンパイルするコードができ、問題の原因がわかるまで、複雑な要素を削除/置換します。
致命的なエラーC1001:コンパイラで内部エラーが発生しました。 1&gt;(コンパイラファイル 'f:\ dd \ vctools \ compiler \ utc \ src \ p2 \ p2symtab.c
iは、vs 2005のコードをvs 2008にビルドしようとしたときにも同じエラーを観測しましたが、VS 2008のサービスパックをインストールしない限り発生します...
サービスパックをインストールしました...これで問題が解決したと思います...
これは通常、テンプレートのインスタンス化で発生します。残念ながら、多くの原因が考えられますが、99%の時間でコードが微妙に未定義の動作を呼び出しています。