2013-02-14 11 views
6

Ich habe ein C++ - Projekt unter Visual Studio 2010, das in eine DLL kompiliert. Ich habe mehrere private implementierungsspezifische Klassen in meinem Projekt definiert, z. CMyClass. Diese Klasse wird nicht von der DLL oder von einer Schnittstellenfunktion exportiert. Wenn ich jedoch generierte DLL-Dateien überprüfe, ist dort eine Zeichenfolge "CMyClass" gespeichert. Es ist ein Release-Build, und ich möchte nicht, dass diese Zeichenfolge in der DLL-Datei angezeigt wird. Diese DLL wird an Kunden ausgeliefert, und ich möchte, dass alle Namen, die ich in meinem Projekt verwendet habe, aus der DLL-Datei entfernt werden, damit niemand einen so einfachen Hinweis darauf bekommen kann, welche Algorithmen wir in unserer DLL verwenden.Entfernen Sie C++ - Klassennamen aus Binärdll-Datei

Ich benutze Release-Konfiguration. In den Projekteigenschaften ist die Option "Debug-Info generieren" unter der Linker-Registerkarte deaktiviert, das "Debug-Informationsformat" auf der Registerkarte C/C++ ist auf "Programmdatenbank (/ Zi)" eingestellt. Ich habe versucht, leere Zeichenfolge für "Debug Information Format" ohne Erfolg festzulegen.

Die in der DLL gefundene Zeichenfolge sieht wie [email protected]@ aus und befindet sich am Ende der DLL-Datei. Es ist das einzige Vorkommen der Zeichenfolge "CMyClass" in der DLL-Datei. Diese Zeichenfolge wird jedoch für fast alle meine internen Klassen angezeigt.

Wie Sie diese Erwähnungen loswerden?

aktualisieren

Bitte beachten Sie, ich will nicht zu den Code selbst Quelle verschleiern. Der angegebene Link ist irrelevant. Ich sehe nur keinen Grund, warum Klassennamen in der DLL-Datei gespeichert sind. Ich kann meine Klassen vor dem Build immer umbenennen, aber es ist keine sehr direkte Lösung.

Update2

Ich bin nicht mit Gemeinschaft verpflichten sich, diese qustion beim Schließen, da dies kein Duplikat ist. Und die Antwort wird in den Kommentaren von Tyler Gill gegeben. Danke an ihn und Schande über andere.

+1

http://stackoverflow.com/questions/1025494/obfuscating-cc-code – Ram

+1

"Ich möchte nicht, dass diese Zeichenfolge in der DLL-Datei angezeigt wird" Was ist der genaue Grund, warum Sie den Namen der Klasse zu denken versteckt sein. Das Kompilieren eines C++ Codes ist genug Verschleierung an sich! – Ram

+0

@Ram Da die Namen der Klassen den Namen der Algorithmen entsprechen, die wir verwenden, um das Problem zu lösen. Wir wollen nicht, dass irgendjemand weiß, welche Algorithmen wir verwenden. – Mikhail

Antwort

4

Wie meine Vermutung von einem Kommentar richtig erscheint, Reposting ich dies als eine Antwort.

Die Zeichenfolge des Klassennamens ist ein Ergebnis der Aktivierung von RTTI (Runtime Type Information) für die kompilierten Binärdateien. Wenn RTTI aktiviert ist, erstellt der Compiler Objekte, die Informationen zu den in die Binärdatei kompilierten Typen speichern. Eine dieser Eigenschaften ist der Name des Typs.

Beachten Sie, dass einige Anwendungen von dynamic_cast und typeid RTTI erfordern, daher wird die Deaktivierung diese Features von C++ kosten.

Um RTTI in Visual Studio zu deaktivieren, verwenden Sie die /GR- Schalter (siehe http://msdn.microsoft.com/en-us/library/we6hfdy0(v=vs.100).aspx, als Mikhail veröffentlicht.)

es in GCC zu deaktivieren, die -fno-rtti Schalter verwenden.

+1

Hat das selbe und es funktionierte nur für einen Teil der Klassennamen. Für andere war das RTTI nicht genug. Offenbar, wenn "std :: bind" mit virtuellen Funktionen verwendet wird - der Klassenname kann in der Binärdatei erscheinen, auch wenn RTTI deaktiviert ist. Verwenden Sie einfach nicht std :: bind (oder verwandte Funktion) –

2

Wie Tyler Gill in den Kommentaren erwähnt, wurde diese Zeichenfolge vom Compiler aufgrund RTTI gelassen, da CMyClass tatsächlich IMyClass erbt und polymorph ist. Mein Problem kann einfach gelöst werden durch disabling RTTI mit /GR- Schalter. Vielen Dank.