不使用CRT编译C ++

Pri*_*num 3 c++ native

标题基本上说明了一切;当我用C ++编码时,我想完全禁用CRT。

我希望能够在Win98以及所有其他操作系统上运行exe。只是朴素的NATIVE C ++。

我使用的编译器是Visual Studio。但是,我愿意根据需要进行更改。

jst*_*ine 7

您可以删除对Microsoft提供的CRT的所有引用,并将其替换为您自己的自定义轻量级CRT。这样做的说明有些冗长,并在此处与随附的源代码很好地进行了总结:

https://www.codeproject.com/articles/15156/tiny-c-runtime-library

这些说明有些过时了,但是我设法使其中的一部分tlibc可以在Visual Studio 2017和Windows 10上使用。除FILEAPI 之外的所有东西似乎都可以编译和运行。遵循的主要步骤是:

  1. 创建一个控制台应用程序项目。
  2. 禁用所有标准库的链接(/NODEFAULTLIB)
  3. 禁用所有编译器运行时检查(RTC)

那时,tilbc源进行了编译和运行(没有过时的FILE部分)。


也就是说,OP的实际问题是完全不同的。CRT不应为此错误负责.exe is not a valid win32 application。在实际执行二进制文件中的任何代码(包括在main()/ 之前执行的CRT)之前,都会发生此错误winmain()。它通常在尝试x64在x86操作系统上运行二进制文件时发生。从理论上讲,只要您在包含时使用正确的SDK版本标志,甚至Visual Studio 2017工具链也可以构建适用于Windows 2000和Win98的应用程序<windows.h>。

即使在使用错误的SDK或编译器标志的情况下,所报告的错误也可能是其他错误-很有可能是DLL加载失败或弹出错误,其内容类似于“程序无法启动”,随后出现兼容性模式提供。


Gam*_*per 1

在不知道你需要做什么的情况下很难提供帮助,一般情况下你无法删除 CRT,原因如下:

  • 入口点(从控制台获取输入)
  • 提供C和C++中使用的常用函数

这意味着如果没有 CRT,您将无法使用这两个 stdio(除非您稍后手动链接它),也无法在控制台中运行应用程序。

删除 CRT 的一种方法是创建静态库,如果您不在其中链接外部库,则这尽可能接近纯本机 C++(嗯,目标文件比 navite C++ 更接近 navite C++)静态库)。

根据操作系统的不同,如果没有 CRT,您甚至可能无法调用二进制文件中的函数(例如 Windows)。因此,如果您只是想避免二进制开销,最好的选择是拥有一个链接到其他“启动器”或只是动态调用的静态/动态库(无论如何都需要一种检索入口点的方法)。

同样,如果您没有提供足够的详细信息,则很难说出您需要什么。

编辑:

如果您需要在较旧的 win98 上运行,请使用支持 win98 的编译器,并使用编译器标志指定您要为 win98 进行编译。