2011-12-31 69 views
2

球员我想开始使用C++进行编程。我在vb6,vb.net写了一些程序,现在我想用C++来获得知识,我想要的是一个编译器,它可以将我的代码编译到最小的windows应用程序。例如,有一种称为PureBasic的Basic语言编译器,可以使Hello World独立应用程序的大小为5 kb,并且我编译的简单套接字程序仅为12kb(没有任何DLL-s和Runtime文件)。我知道这是惊人的,所以我想为C++这样的东西。用于最小可执行文件的C++ Windows编译器

如果我错了,也没有这样的Windows编译器有人可以给我一个网站或书,可以教我如何减少C++可执行文件大小,或如何使用Windows API调用?

+10

从学习C++开始,然后担心EXE大小。如果你没有花时间去学习核心原则,你会遇到各种各样的麻烦。 – Matt 2011-12-31 15:39:54

+0

看看http://www.codeproject.com/KB/library/tlibc.aspx – dalle 2011-12-31 15:41:17

+1

通常可执行的大小不是一个问题。另外,请注意,尽管您声明应用程序没有运行时或dll,但这并不准确。更重要的是这些运行时是否是系统的标准。 – Serodis 2011-12-31 15:41:41

回答

3

多年前我不得不用VC6来做这件事。这是必要的,因为可执行文件将通过网络传输到目标计算机,并在该计算机上运行。由于它可能通过调制解调器连接发送,因此它需要尽可能小。为了缩小可执行文件,我依靠两种技术:

  1. 请勿使用C或C++运行库。告诉编译器不要将它们链接起来。使用Windows API的一个子集实现所有必要的功能,该API的保证在当时所有版本的Windows上都可用(98,Me,NT,2000)。
  2. 告诉链接器将所有代码和数据段合并成一个。我不记得这个开关,我不知道它是否仍然有可能,特别是对于64位可执行文件。

最终可执行文件的大小:〜2K

5

例如Microsoft Visual C++编译器...您只需关闭链接到C运行库(/NODEFAULTLIB),并且您的可执行文件将小至5KB。只有一个问题:几乎不能使用标准C和C++库中的任何内容,也不能使用C++的标准功能,如异常处理,运算符newdelete,浮点运算等等。您只需要使用纯操作系统功能(例如,使用CreateFile创建文件,使用HeapAlloc分配内存等)。

+0

要公平,您可以使用操作系统函数 – Milan 2011-12-31 16:15:53

+0

@ entity64编写自己的新/删除操作符:是的,您也可以从头开始实现您需要的CRT部分。 – ybungalobill 2011-12-31 17:07:50

0

我不知道为什么你是学习语言之前感兴趣的这种优化的,但反正...

它不会使你用什么编译太大的区别,但你怎么用它。例如,选择一个像Visual Studio C++或MinGW这样的编译器,并阅读它的文档。您将找到关于如何优化编译大小或性能的信息(通常在优化大小时会损失性能,反之亦然)。

例如,在Visual Studio中,通过将/ O1参数传递给编译器(或项目属性/ C-C++/Optimization),可以最大限度地减小可执行文件的大小。

另外不要忘记在“发布”模式下编译,或者您的可执行文件可能会充满调试符号,这将增加可执行文件的大小。

+0

感谢您的好答案,但我认为如果一小部分人做出了基本语言编译器,该编译器会生成可扩展的小型exe文件,那么对于C++应该有类似的东西,我认为我错了 – Irakli 2011-12-31 16:02:09

0

运行Windows的现代桌面PC至少有1G内存和巨大的硬盘,担心一个无法代表任何实际应用程序的普通程序的大小是毫无意义的。

任何语言的“Hello world”程序的大部分大小都是固定的开销,与建立执行环境和加载并启动代码有关。对于任何非平凡的应用程序,您应该更关心代码大小随着添加更多功能而增加的速率。从这个意义上说,任何编译器中的C++代码都非常有效。也就是说,你的PureBasic程序几乎没有或者没有什么可能比同等的C++程序小,但是当你在代码中构建有用的功能时并不一定如此。如果printf()(或cout <)的代码是静态链接的,则生成的可执行文件可能会更大,因为printf()具有很多功能,它们是没有用在“hello world”程序中,因此是多余的。例如尝试使用puts(),您可能会发现代码较小。

此外,你确定你是苹果比较苹果?某些执行环境依赖于动态链接的运行时库或虚拟机,该虚拟机提供的功能可能在C++程序中静态链接。

-1

我不喜欢回复死职位,但因为没有响应的提到了这一点(除了垫响应)...

重复在我之后:C++!=(vb6 || vb.net || basic)。我不仅仅提到语法,C++编码风格通常与VB中的编程风格不同,因为C++程序员试图使事情通常比vb程序员设计得更好......

PS:不,不存在在C++世界中复制粘贴。对不起,不得不说,这...

相关问题