visual studio 2010-从二进制dll文件中删除C++类名
visual studio 2010 - Remove C++ class names from binary dll file
我在Visual Studio 2010下有一个C++项目,它可以编译成dll。我在我的项目中定义了几个特定于私有实现的类,例如CMyClass
。此类不会从dll或任何接口函数导出。但是,当我检查生成的dll文件时,其中存储了一个字符串"CMyClass"。这是一个发布版本,我不希望这个字符串出现在dll文件中。这个dll是发给客户的,我希望我在项目中使用的所有名称都能从dll文件中删除,这样就没有人能得到我们在dll中使用什么算法的简单线索。
我使用Release配置。在项目属性中,链接器选项卡下的"生成调试信息"选项被关闭,C/C++选项卡下的《调试信息格式》被设置为"程序数据库(/Zi)"。我试图为"调试信息格式"设置空字符串,但没有成功。
在dll中找到的字符串看起来像.?AVCMyClass@@
,并且位于dll文件的最后。它是dll文件中唯一出现的"CMyClass"字符串。然而,这个字符串几乎适用于我的所有内部类。
如何消除这些提及?
更新
请注意,我不想混淆源代码本身。提供的链接无关紧要。我只是看不出为什么类名存储在dll文件中。我总是可以在构建之前重命名我的类,但这不是一个非常直接的解决方案。
更新2
我不同意社区关闭这个问题,因为这不是重复的。泰勒·吉尔在评论中给出了答案。感谢他,为他人感到羞耻。
由于我从评论中的猜测似乎是正确的,我将此作为答案转发。
类名的字符串是为编译的二进制文件启用RTTI(运行时类型信息)的结果。启用RTTI时,编译器会创建对象,存储编译成二进制文件的类型的信息,其中一个属性是类型的名称。
请注意,dynamic_cast
和typeid
的某些使用需要RTTI,因此禁用会使您失去C++的这些功能。
要在Visual Studio中禁用RTTI,请使用/GR-
开关(请参阅http://msdn.microsoft.com/en-us/library/we6hfdy0(v=vs.100).aspx,正如米哈伊尔发布的。)
要在GCC中禁用它,请使用-fno-rtti
开关。
正如Tyler Gill在评论中提到的那样,由于CMyClass
实际上继承了IMyClass
并且是多态的,所以由于RTTI,编译器留下了这个字符串。使用/GR-
开关禁用RTTI可以很容易地解决我的问题。谢谢
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- C++中的线程安全删除
- 如何从存储在std::映射中的std::集中删除元素
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数