0

ネイティブC++とC++/CLIでビルドされたプロジェクトがあります。私は次のコンポーネントを持っています:

アセンブリA(C ++ / CLI)
 | 使用
アセンブリB(C ++ / CLI)
 | 使用
静的LibC(ネイティブC ++)

Static Lib Cを大幅に書き直したところ、コンパイルされ、それを使用する他のネイティブプロジェクトも正常にコンパイルされました。再書き込みでアセンブリBは変更されませんでした。予想どおり、アセンブリBをコンパイルすると、エラーや警告なしで正常にコンパイルされます。ただし、アセンブリAをコンパイルしようとすると、アセンブリBで使用できるはずのシンボルが見つからないため、何百ものエラーが発生します。運が悪かったので、Aプロジェクトの参照としてBとCを追加および削除してみました。私はクリーンを実行し、すべてを最初から再構築しようとしましたが、それでも運がありませんでした。アセンブリBをRedGateのReflectorにロードしましたが、シンボルが表示されないので、少なくともそれは一貫しています。ブランチで作業しているので、トランクから以前のバージョンのアセンブリBをロードしました(ブランチからロードした以前のバージョンをアンロードするように求められました)。その中のすべてのシンボルを見ることができました。したがって、Reflectorで現在のバージョンのAssembly Bを見ると、次のようになります。

+ TFModelSetNETD、Version = 1.0.3532.42171、Culture = neutral、PublicKeyToken = null
  + TFModelSetNETD.dll
    +参照
      +{}-
      + <CppImplementationDetails>
      + <CrtImplementationDetails>
      + vc_attributes

そしてそれがすべてです。古いバージョンでは、これらの4つのエントリに加えて、アセンブリB、静的Lib C、その他のライブラリで宣言されたすべての名前空間に加えて、いくつかのboostおよびstd名前空間が表示されます。これはVisualStudio2008にあります。

ここで何が起こっているかについて何かアイデアはありますか?なんらかの警告を出さずに、コンパイラがシンボルをエクスポートしないようにするために何ができたのか理解できません。

アイデア、ヒント、またはデバッグの提案はすべて大歓迎です。

編集:静的Lib CをLibDumpにロードしましたが、すべてのシンボルがあります-ただし、Redgate Reflectorで調べると、アセンブリBで定義されているシンボル、または静的LibCから参照されているシンボルはアセンブリBに表示されません。

4

1 に答える 1

0

何が起こったのかというと、問題のシンボルのヘッダーファイルがcppファイルに含まれていなかったということです。なぜそれが機能したのかについて私が持っている唯一の説明は、おそらく他のコンパイルユニットの1つが問題のヘッダーを間接的に含んでいたが、それが書き直しで変更されたとき、シンボルはもはやどこにも含まれていなかったということです。信じられないかもしれませんが、この問題は私が次にヒットした問題と比較して簡単でした-boost :: threadは、DLLの初期化とスレッドローカルストレージに関連する競合のために、アセンブリがロード時に例外をスローする原因になります。

于 2009-10-08T03:05:43.970 に答える