Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
拆下C&x2B+;二进制dll文件中的类名 我在VisualStudio 2010下有一个C++项目,它编译成一个DLL。我在项目中定义了几个专用于实现的类,例如CMyClass。此类不会从dll或任何接口函数导出。但是,当我检查生成的dll文件时,其中存储了一个字符串“CMyClass”。这是一个发布版本,我不希望这个字符串出现在dll文件中。这个dll已发送给客户,我希望我在项目中使用的所有名称都从dll文件中剥离出来,这样就没有人能够获得我们在dll中使用的算法的简单线索_C++_Visual Studio 2010_Dll_Linker_Obfuscation - Fatal编程技术网

拆下C&x2B+;二进制dll文件中的类名 我在VisualStudio 2010下有一个C++项目,它编译成一个DLL。我在项目中定义了几个专用于实现的类,例如CMyClass。此类不会从dll或任何接口函数导出。但是,当我检查生成的dll文件时,其中存储了一个字符串“CMyClass”。这是一个发布版本,我不希望这个字符串出现在dll文件中。这个dll已发送给客户,我希望我在项目中使用的所有名称都从dll文件中剥离出来,这样就没有人能够获得我们在dll中使用的算法的简单线索

拆下C&x2B+;二进制dll文件中的类名 我在VisualStudio 2010下有一个C++项目,它编译成一个DLL。我在项目中定义了几个专用于实现的类,例如CMyClass。此类不会从dll或任何接口函数导出。但是,当我检查生成的dll文件时,其中存储了一个字符串“CMyClass”。这是一个发布版本,我不希望这个字符串出现在dll文件中。这个dll已发送给客户,我希望我在项目中使用的所有名称都从dll文件中剥离出来,这样就没有人能够获得我们在dll中使用的算法的简单线索,c++,visual-studio-2010,dll,linker,obfuscation,C++,Visual Studio 2010,Dll,Linker,Obfuscation,我使用发布配置。在项目属性中,链接器选项卡下的“生成调试信息”选项处于关闭状态,C/C++选项卡下的“调试信息格式”设置为“程序数据库(/Zi)”。我试图为“调试信息格式”设置空字符串,但没有成功 在dll中找到的字符串看起来像?AVCMyClass@,位于dll文件的最末端。它是dll文件中唯一出现的“CMyClass”字符串。但是,这个字符串几乎适用于我的所有内部类 如何摆脱这些提及 更新 请注意,我不想混淆源代码本身。提供的链接是不相关的。我只是不明白为什么类名存储在dll文件中。我总是可

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

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

如何摆脱这些提及

更新

请注意,我不想混淆源代码本身。提供的链接是不相关的。我只是不明白为什么类名存储在dll文件中。我总是可以在构建之前重命名我的类,但这不是一个非常简单的解决方案

更新2


我不同意社区关闭此问题,因为这不是重复。答案在作者的评论中给出。多亏了他,也让其他人感到羞耻。

如评论中所述,由于
CMyClass
实际上继承了
IMyClass
并且是多态的,所以这个字符串是由于RTTI而被编译器留下的。我的问题可以通过使用
/GR-
开关轻松解决。谢谢。

由于我从一条评论中的猜测似乎是正确的,我将此作为答案转载

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

<>请注意,<>代码> DyrimySCAP> <代码> > <代码> Type ID>代码>需要RTTI,因此禁用将使您失去C++的特性。 要在Visual Studio中禁用RTTI,请使用
/GR-
开关(请参阅Mikhail发布的。)


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

“我不希望此字符串出现在dll文件中”您认为隐藏类名称的确切原因是什么。编译一个C++代码本身就足够混淆了!Ram,因为类的名称对应于我们用来解决问题的算法的名称。我们不想让任何人知道我们使用什么算法。您正在编译的文件中是否启用了RTTI?它创建存储类型信息的对象并将其添加到二进制文件中,其中一个属性是类型的名称。除此之外,模糊处理似乎是你想要走的路。如果编译器将类名放入二进制文件,那么它这样做是有原因的。但您应该能够使用模糊处理工具为您重命名内部类。@TylerGill您的猜测实际上是一个答案。如果使用/GR-switch禁用RTTI,则dll文件中不再显示名称。看看你是否愿意,你可以发布一个答案,我会投票并接受:)做了同样的事情,它只对部分类名有效。对于其他人来说,RTTI是不够的。显然,在虚拟函数中使用“std::bind”时,即使禁用RTTI,类名也可能出现在二进制文件中。不要使用std::bind(或相关函数)