2010-03-31 17 views
2

我查看了源代码中MSVC 2010生成的二进制文件,并看到所有内容都充满了“垃圾”。Visual Studio C++将“垃圾”添加到我的程序中

(不,自称为“我的代码”的那种垃圾),我不知道该怎么解释,但我的可执行文件被添加了太多不必要的信息,如:

  • 许多微软默认的错误信息,我不想让他们
  • XML架构设置(为什么!?)
  • 其他的事情不是主程序

我怎样才能阻止MSVC这样的执行很重要?我必须切换到GCC吗?

在所有其他程序(用C++编写,从Word处理器到游戏),这个垃圾根本不存在。

+3

不要把它称为垃圾,你可能想知道每件物品的实际内容。 – shoosh 2010-03-31 10:13:29

+0

shoosh:*很多微软的默认错误信息,我不想要它们 * XML模式设置(为什么!?) *对于执行主程序不重要的其他事情 – sub 2010-03-31 10:24:03

+1

什么错误信息? – jcoder 2010-03-31 10:31:17

回答

0

其他然后切换到另一个编译器,你可以尝试编译器优化。启用“功能级链接”,“整个程序优化”以及消除未使用的数据/代码 - 很可能某些您不喜欢的代码/数据实际上未被使用,并且链接器可能会简单地将其消除。

+0

我已经做了,但这似乎并没有解决问题。没有任何项目选项可用于“不要搞乱我的可执行文件”。 – sub 2010-03-31 10:08:15

+1

@sub:你能引用编译器和链接器的命令行吗?它们可以在项目的“C++”和“Linker”部分的“comman line”部分中看到。 – sharptooth 2010-03-31 10:09:59

7

许多微软默认的错误消息,我不想让他们

,因为你使用的是C/C++运行时(例如,的malloc,printf的,strcpy的)

XML架构设置(为什么?)

因此,您可以获得适当的UAC(用户帐户控制)处理,最新的comctrl(Windows主题控件所需的适用于您的程序),并指定要使用哪个msvcrt.dll。

编辑: 另一个会导致额外代码的功能,是VC在堆栈中放置cookie以及验证cookie的相关代码。有关更多信息,请参阅http://blogs.msdn.com/michael_howard/archive/2007/04/03/hardening-stack-based-buffer-overrun-detection-in-vc-2005-sp1.aspx

+0

如果大多数其他可执行文件不需要,G ++甚至没有它,为什么我需要它? – sub 2010-03-31 10:09:11

+0

你不必有这两件事,我只是解释它为什么把它们放在那里。你可以关闭他所选择的清单文件,你可以定义自己的入口点并且不使用任何c运行库,并且你会得到你所要求的。 – SteelBytes 2010-03-31 10:11:40

+0

例如http://www.benshoof.org/blog/small-programs/ – SteelBytes 2010-03-31 10:13:36

1

为什么你认为它们对于应用程序的运行并不重要?如果他们是?你提到的“其他事物”是什么?

如果您删除了默认错误消息,用户可能会合法地遇到该错误,则不会显示任何消息,从而使其更糟糕。 (如提到的另一个答案很可能来自C运行时库,并且很可能您的程序确实需要它!)

XML可能是嵌入式清单,它指定了一些DLL要求。这有助于防止程序依赖于具有相同名称的不同DLL版本的'DLL地狱'情况。除其他外,它指定了DLL的准确版本信息,所以你从不会遇到那种丑陋的情况。再次,这似乎是你想要的东西。

对于大多数C++编译器的库和编译器设置将最有可能加入“垃圾”(我只是把它叫做库数据),因为它们提供一切有用功能,不必全部解决这些问题为您节省再一次你自己。如果你仍然不喜欢这些 - 停止使用编译器,并开始使用汇编器。然后你可以指定确切的什么是和不在最终编译的程序,但你可能最终会重新发明轮子...

0

你所看到的不是“垃圾”。

许多微软默认的错误消息,我不想让他们

想必你想使用你所链接到的库,不然你就不会被链接到他们。

XML架构设置(为什么!?)

,XML是应用程序的manifest。为什么在那里?因为你要求链接器添加它。看看你传递给链接器的命令行。它将包括/MANIFEST/MANIFESTFILE参数。

其他的事情主程序

如果你不知道它们是什么的执行并不重要,你怎么知道他们是不是很重要?

相关问题