不使用CRT编译C ++

时间:2016-04-14 15:13:50

标签: c++ native

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

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

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

5 个答案:

答案 0 :(得分:3)

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

你有理由定位Win98吗?几乎没有人再使用它了。我建议使用Windows Vista +,但这完全取决于你。

首先,您需要禁用优化,将RT lib设置为MT,禁用安全检查(这将使您的应用程序不太安全!)等等。为此,请转到C / C ++设置并将/ Od / MT / GS-添加到命令行。 接下来转到代码生成并将启用C ++异常设置为否。 之后转到链接器并将/ NODEFAULTLIB添加到命令行。 最后,导航到Advanced并设置入口点。

之后,你很高兴去!

答案 1 :(得分:3)

您可以删除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. 的链接
  4. 禁用所有编译器运行时检查(RTC)
  5. 此时,tilbc源编译并运行(没有过时的FILE部分)。

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

    即使在使用错误的SDK或编译器标志的情况下,报告的错误也是其他的 - 很可能是DLL加载失败或弹出错误读取&#34;程序的内容无法启动&#34; ,然后是兼容模式产品。

答案 2 :(得分:2)

您可以使用正确的项目设置静态链接C ++运行时,但即便如此,您最多也可以使用Windows XP。

您可以了解如何静态链接标准库here,但以防链接死亡:

  

在Visual Studio开发环境中设置此编译器选项

     

1)打开项目的“属性页”对话框。有关详细信息,请参见如何:打开项目属性页。

     

2)展开C / C ++文件夹。

     

3)选择代码生成属性页。

     

4)修改运行时库属性。

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

答案 3 :(得分:1)

答案 4 :(得分:0)

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

  • 入口点(从控制台输入)
  • 提供常用功能 在C和C ++中

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

一种可以删除CRT的方法是创建一个静态库,如果你不在其中链接外部库,那么这就像纯粹的本机C ++一样可能(好吧,一个目标文件更接近于navite) C ++而不是静态库)。

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

同样,如果你没有提供足够的细节,很难说出你需要什么。

编辑:

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