微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

生成小的Windows二进制文件

在开发和部署原生Windows应用程序时,我经常需要先安装一个运行库,然后才能运行我的二进制文件,或者静态链接库和二进制文件。 例如,使用Visual Studio 2008构build“Win32控制台”项目之后,尝试在新的Windows 7映像上运行该程序将导致:

应用程序无法启动,因为其并行configuration不正确。 请参阅应用程序事件日志或使用命令行sxstrace.exe工具获取更多详细信息。

类似这样的问题已经在StackOverflow的其他文章中提出。

如何开发不需要目标操作系统上的运行时(即不需要安装可再发行程序包或私有/共享并行程序集)的应用程序? 如何避免使用msvc [mpr] 90.dll,只使用 windows system32 *。{dll,sys}中的Windows API?

在Silverlight中,如何在按下button时使新窗格显示

Borland Delphi 7 TExcelApplication.Connect适用于办公室机器,但不适用于客户端

在哪些Windows系统上认禁用Command Extensions?

如何在Windows上备份MysqL数据库

如何使用Win32 API获取多个显示器的显示名称

我正在考虑从demoscene出来的代码的线条,但这往往是不可用的。

如何在Windows开发环境中使用PHP中的MSsql进行PDO?

DirectShow – 如何从源filter中读取文件

为什么perl不能看到windows中存在的文件

检测.bat文件是否在分配给它的控制台中启动

cmd.exe / k(echo%1&echo%〜n1)在inputregistry命令键时不会如预期那样输出

其他人已经对静态链接CRT做出了回应。 如果你同时也想要一个小的二进制文件,那么你最好的选择是完全放弃CRT,并尽可能地只使用Win32 API函数。 你仍然会得到一些CRT代码,尤其是与启动(即调用main )和关闭( atexit处理等)相关的CRT代码,否则链接器将不会链接你不使用的CRT函数

您可以避免使用/Zl编译器开关完全链接CRT。 这意味着main将不再工作,但是,您需要定义WinMain (名称无关紧要,但签名必须匹配,必须是__stdcall ),并且必须指定您的WinMain类的名称通过链接器/entry:交换机作为入口点。 这样可以节省大约30Kb的CRT代码(用一个空main在一个.cpp上测试)。

如果你走的是后者,你可能还得面对编译器内在问题。 有一些名义上由CRT定义的函数(在其头文件中声明),但是编译器会专门处理这些函数,以便在可能的地方在调用点插入优化的汇编指令 – 例如memset , strlen ,以及<math.h>一大块函数一个完整的列表可以在这里找到。 既然你没有CRT,如果你需要这些功能,或者可以避免它,但是由于改进的性能(比memset好得多),那么你就必须自己声明它们,并使用#pragma intrinsic 。 例如:

// Contains macros and typedef only,so safe to include without CRT. // We need it here for size_t. #include <stddef.h> extern "C" { int abs(int); void* memset(void*,int,size_t); } #pragma intrinsic(abs,memset) int __stdcall main(void*,void*,char*,int) { char tmp[10]; memset(tmp,abs(-123),10); return 0; }

以上可以编译为:

cl /c /Zl foo.cpp link /entry:main foo.obj

通过/MT开关静态链接CRT(如果使用的话,也是MFC)。

静态链接限制了你可以用DLL做些什么,但是对于简单的可执行文件来说,它就像一个魅力一样。 (如果你正在运送DLL,你总是可以运送私人程序集。)

使用静态CRT。 这不会创建对msvc * .dll的依赖关系。 CRT直接链接到你的程序中。 这不会创建依赖项,但会增加可执行文件的大小。

更多信息在这里不同的CRT选项。

静态链接运行时。 MS Visual C ++有选项/ MT的(认是/ MD)

我认为这样做的一个方法就是不使用Visual Studio,而是依靠命令行SDK工具。 (你也可以想出如何配置VS做你想做的事情,但这似乎更难。)例如:

cl /c app.cpp link app.obj ws2_32.lib

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐