在没有 CRT 的情况下编译 C++

Compile C++ without CRT

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

我希望能够 运行 Win98 上的 exe 以及所有其他的。 只是简单的 NATIVE C++。

我使用的编译器是Visual Studio。但是,如果需要,我愿意更改。

您可以使用正确的项目设置静态 link C++ 运行时,但即便如此,您最多也只能在 Windows XP 上运行它。

您可以了解如何静态 link 标准库 here,但以防万一 link 死掉:

To set this compiler option in the Visual Studio development environment

1) Open the project's Property Pages dialog box. For details, see How to: Open Project Property Pages.

2) Expand the C/C++ folder.

3) Select the Code Generation property page.

4) Modify the Runtime Library property.

如果您真的想让它在Windows 98上工作,那么您需要使用旧版本Visual Studio 并执行类似上述操作。

不知道你需要做什么很难帮助,一般情况下你无法删除 CRT,here's why:

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

这意味着如果没有 CRT,您将无法使用任何一个 stdio(除非您稍后手动 link 它),您也不能 运行 中的应用程序控制台.

删除 CRT 的一种方法是创建一个静态库,如果您不在其中 link 外部库(好吧,一个目标文件),这将尽可能接近纯原生 C++比静态库更接近 navite C++。

根据操作系统的不同,您甚至可能无法在没有 CRT 的情况下调用二进制文件中的函数(例如 Windows)。因此,如果您只是想避免二进制开销,最好的办法是拥有一个 static/dynamic 库,该库被 link 编辑到其他 "launcher" 或只是动态调用(这需要一种方法来检索条目无论如何点)。

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

编辑:

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

很有可能,但是有很多缺点所以我不推荐它(我不会深入它们)。

您有针对 Win98 的理由吗?几乎没有人再使用它了。我推荐 Windows Vista+,但是,这完全取决于您。

首先,您需要禁用优化,将 RT 库设置为 MT,禁用安全检查(这会降低您的应用程序的安全性!),等等。为此,请转到 C/C++ 设置并将 /Od /MT /GS- 添加到命令行。

接下来转到代码生成并将启用 C++ 异常设置为否。 之后转到链接器并将 /NODEFAULTLIB 添加到命令行。 最后,导航到“高级”并设置入口点。

之后你就可以开始了!

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

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

说明有点过时了,但我设法让 tlibc 的部分内容在 Visual Studio 2017 和 Windows 10 上工作。除了 FILE API 似乎编译和工作。要遵循的步骤是:

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

此时,tilbc 源已编译并且 运行(没有过时的文件部分)。


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

时使用正确的 SDK 版本标志

即使在使用了错误的 SDK 或编译器标志的情况下,报告的错误也可能是其他原因——很可能是 DLL 加载失败或弹出式错误读取类似于 [= 的内容45=] 然后提供兼容模式。

指南 - 如何避免 C/C++ 在 Windows 上运行:

https://hero.handmade.network/forums/code-discussion/t/94-guide_-_how_to_avoid_c_c++_runtime_on_windows

您可以尝试使用不同的编译器,例如 Symantec C++ 7.5 或 Digital Mars C++。

我有赛门铁克编译器制作的程序,即使在 Win 11 中也运行完美无缺。

事实上,向 90 年代应用程序 pfe32(程序员文件编辑器)的作者致敬,运行s' 在任何 Windows 版本上。