在没有 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 似乎编译和工作。要遵循的步骤是:
- 创建控制台应用程序项目。
- 禁用所有标准库的链接(
/NODEFAULTLIB
)
- 禁用所有编译器运行时检查 (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 上运行:
您可以尝试使用不同的编译器,例如 Symantec C++ 7.5 或 Digital Mars C++。
我有赛门铁克编译器制作的程序,即使在 Win 11 中也运行完美无缺。
事实上,向 90 年代应用程序 pfe32(程序员文件编辑器)的作者致敬,运行s' 在任何 Windows 版本上。
标题基本上说明了一切;我想在用 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 似乎编译和工作。要遵循的步骤是:
- 创建控制台应用程序项目。
- 禁用所有标准库的链接(
/NODEFAULTLIB
) - 禁用所有编译器运行时检查 (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 或编译器标志的情况下,报告的错误也可能是其他原因——很可能是 DLL 加载失败或弹出式错误读取类似于 [= 的内容45=] 然后提供兼容模式。
指南 - 如何避免 C/C++ 在 Windows 上运行:
您可以尝试使用不同的编译器,例如 Symantec C++ 7.5 或 Digital Mars C++。
我有赛门铁克编译器制作的程序,即使在 Win 11 中也运行完美无缺。
事实上,向 90 年代应用程序 pfe32(程序员文件编辑器)的作者致敬,运行s' 在任何 Windows 版本上。