我在 Visual Studio 2010 下有一个 C++ 项目,它编译成 dll。我在我的项目中定义了几个私有的特定于实现的类,例如CMyClass
。该类不是从 dll 或任何接口函数导出的。但是,当我检查生成的dll文件时,其中存储了一个字符串“CMyClass”。这是一个发布版本,我不希望这个字符串出现在 dll 文件中。这个 dll 被运送给客户,我希望我在项目中使用的所有名称都从 dll 文件中删除,这样没有人可以得到关于我们在 dll 中使用的算法的简单线索。
我使用发布配置。在项目属性中,链接器选项卡下的“生成调试信息”选项已关闭,C/C++ 选项卡下的“调试信息格式”设置为“程序数据库(/Zi)”。我尝试为“调试信息格式”设置空字符串,但没有成功。
在 dll 中找到的字符串看起来像.?AVCMyClass@@
位于 dll 文件的最末尾。它是 dll 文件中唯一出现的“CMyClass”字符串。然而,这个字符串几乎出现在我所有的内部类中。
如何摆脱这些提及?
Update
请注意,我不想混淆源代码本身。提供的链接无关紧要。我只是不明白为什么类名存储在 dll 文件中。我总是可以在构建之前重命名我的类,但这不是非常直接的解决方案。
Update2
我不同意社区结束这个问题,因为这不是重复的。答案在评论中给出泰勒·吉尔。感谢他,羞辱别人。
由于我对评论的猜测似乎是正确的,因此我将其重新发布为答案。
类名字符串是为编译的二进制文件启用 RTTI(运行时类型信息)的结果。启用 RTTI 后,编译器会创建对象来存储有关编译到二进制文件中的类型的信息,其属性之一是类型的名称。
请注意,某些用途dynamic_cast
and typeid
需要 RTTI,因此禁用将导致您失去 C++ 的这些功能。
要在 Visual Studio 中禁用 RTTI,请使用/GR-
开关(参见http://msdn.microsoft.com/en-us/library/we6hfdy0(v=vs.100).aspx,正如米哈伊尔发布的那样。)
要在 GCC 中禁用它,请使用-fno-rtti
switch.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)