8

Visual Studio 2010 の下に、DLL にコンパイルされる C++ プロジェクトがあります。プロジェクトで定義されたいくつかのプライベート実装固有のクラスがありCMyClassます。このクラスは、dll またはインターフェイス関数によってエクスポートされません。しかし、生成されたdllファイルを確認すると、「CMyClass」という文字列が格納されています。これはリリース ビルドであり、この文字列を dll ファイルに表示したくありません。この dll は顧客に出荷されます。プロジェクトで使用したすべての名前を dll ファイルから削除して、dll で使用しているアルゴリズムについて簡単な手がかりを誰も得られないようにしたいと考えています。

リリース構成を使用します。プロジェクトのプロパティで、[リンカー] タブの [デバッグ情報の生成] オプションがオフになり、[C/C++] タブの [デバッグ情報の形式] が [プログラム データベース (/Zi)] に設定されます。「Debug Information Format」に空の文字列を設定しようとしましたが、成功しませんでした。

dll で見つかった文字列は次のように見え.?AVCMyClass@@、dll ファイルの最後にあります。これは、dll ファイル内に "CMyClass" 文字列が出現する唯一の場所です。ただし、この文字列は、ほとんどすべての内部クラスに表示されます。

これらの言及を取り除く方法は?

アップデート

ソースコード自体を難読化したくないことに注意してください。提供されたリンクは無関係です。クラス名がdllファイルに保存される理由がわかりません。ビルドする前にいつでもクラスの名前を変更できますが、それはあまり単純な解決策ではありません。

Update2

これは重複していないため、この質問を閉じることについてコミュニティに同意しません。その答えは、Tyler Gillのコメントに示されています。彼に感謝し、他人に恥をかかせます。

4

2 に答える 2

7

コメントからの私の推測は正しいように見えるので、私はこれを答えとして再投稿しています。

クラス名の文字列は、コンパイルされたバイナリに対してRTTI(実行時型情報)を有効にした結果です。RTTIが有効になっている場合、コンパイラは、バイナリにコンパイルされた型に関する情報を格納するオブジェクトを作成します。そのプロパティの1つは、型の名前です。

dynamic_castRTTIの一部の使用法と必要性に注意してください。そのtypeidため、無効にすると、C++のこれらの機能にコストがかかります。

Visual StudioでRTTIを無効にするには、/GR-スイッチを使用します(Mikhailが投稿したように、http://msdn.microsoft.com/en-us/library/we6hfdy0 (v = vs.100).aspxを参照してください)。

GCCで無効にするには、-fno-rttiスイッチを使用します。

于 2013-02-14T21:34:15.807 に答える
2

Tyler Gillがコメントで述べたように、この文字列は、CMyClass実際には継承され、ポリモーフィックであるため、RTTIのためにコンパイラによって残されましたIMyClass私の問題は、スイッチでRTTIを無効にすることで簡単に解決できます/GR-。ありがとう。

于 2013-02-14T11:57:04.497 に答える