8

我在 Visual Studio 2010 下有一个 C++ 项目,它编译成一个 dll。我的项目中定义了几个专用于实现的私有类,例如CMyClass. 此类不是从 dll 或任何接口函数导出的。但是,当我检查生成的 dll 文件时,其中存储了一个字符串“CMyClass”。这是一个发布版本,我不希望这个字符串出现在 dll 文件中。此 dll 已交付给客户,我希望将我在项目中使用的所有名称从 dll 文件中删除,因此没有人能够获得如此简单的线索来了解我们在 dll 中使用的算法。

我使用发布配置。在项目属性中,链接器选项卡下的“生成调试信息”选项被关闭,C/C++选项卡下的“调试信息格式”设置为“程序数据库(/Zi)”。我试图为“调试信息格式”设置空字符串,但没有成功。

在 dll 中找到的字符串看起来像.?AVCMyClass@@并且位于 dll 文件的最末尾。它是 dll 文件中唯一出现的“CMyClass”字符串。但是,这个字符串几乎是为我所有的内部类提供的。

如何摆脱这些提及?

更新

请注意,我不想混淆源代码本身。提供的链接无关紧要。我只是看不出为什么类名存储在 dll 文件中。我总是可以在构建之前重命名我的类,但这不是很直接的解决方案。

更新2

我不同意社区关闭这个问题,因为这不是重复的。Tyler Gill在评论中给出了答案。感谢他,也为别人感到羞耻。

4

2 回答 2

7

由于我从评论中的猜测似乎是正确的,因此我将其重新发布为答案。

类名的字符串是为已编译的二进制文件启用 RTTI(运行时类型信息)的结果。启用 RTTI 后,编译器会创建对象,这些对象存储有关编译到二进制文件中的类型的信息,其中一个属性是类型的名称。

请注意,某些使用dynamic_casttypeid需要 RTTI,因此禁用将使您失去 C++ 的这些功能。

为了在 Visual Studio 中禁用 RTTI,请使用/GR-开关(参见http://msdn.microsoft.com/en-us/library/we6hfdy0(v=vs.100).aspx,如 Mikhail 所发布的那样。)

要在 GCC 中禁用它,请使用-fno-rtti开关。

于 2013-02-14T21:34:15.807 回答
2

正如Tyler Gill在评论中提到的那样,由于 RTTI,这个字符串是由编译器留下的,因为它CMyClass实际上是继承IMyClass的并且是多态的。通过使用开关禁用 RTTI可以轻松解决我的问题。/GR-谢谢。

于 2013-02-14T11:57:04.497 回答