Visual Studio 2015:编译不使用运行时库的C/C++

20

有没有一种方法可以在不使用任何运行时库的情况下使用Visual Studio 2015编译C/C++代码?

我需要在没有运行时库的情况下编译,因为我正在创建自己的运行时库(用于我的操作系统)。

C/C++ -> 代码生成 -> 运行时库有选项, 但我想要一个选项说“无”。

我知道这样会失去许多CRT中的功能。


2
据我所知,使用Visual Studio编译操作系统内核是不可能的 - 它根本就没有为此设计,并且其中许多部分都假定您正在运行Windows。 - user253751
2
同样相关:Visual Studio 生成PE文件格式的可执行文件。你的操作系统运行哪种文件格式? - Mooing Duck
3
另外,请从这里开始:http://wiki.osdev.org/Visual_Studio,并直接进入“自定义C++运行时”。 - Mooing Duck
3
只要(a)代码不调用任何CRT或Win32调用,以及(b)覆盖默认入口点(_DllMainCRTStartup或_WinMainCRTStartup),从而默认情况下会引入CRT,那么在技术上是可能的。但是,正如已经评论过的那样,您仍将得到一个使用Win32 ABI的PE格式二进制文件。 - dxiv
2
@dxiv:虽然很有可能PE是所需的,因为这是UEFI支持/使用的(至少有点)。 - Jerry Coffin
显示剩余3条评论
1个回答

19

如果想在不使用C运行时库(CRT)的情况下编译您的应用程序,请使用/MT/NODEFAULTLIB链接器选项,并在链接器->高级->入口点中重新定义入口点到代码中定义的函数,例如 rawMain。签名为:

DWORD CALLBACK rawMain();

如果没有C运行库,您将无法使用其函数,例如mallocfreememset等。您应该自己实现所有使用的CRT函数。例如,您可以通过使用VirtualAlloc()替换malloc的使用,使用VirtualFree()替换free的使用。

要检查C运行库是否未链接到您的应用程序,请使用Dependency Walker


进一步调查的提示:主函数的 CRT 实现位于 VC\crt\src\vcruntime\exe_common.inl(VS2015)中。 - Nikita
请确保在链接器的“输入”选项中将“忽略所有默认库”设置为“是”,并检查“链接器-> 输入->附加依赖项”列表中是否不包含任何CRT库。此外,请确保不包括任何C ++标准库头文件,因为在这种情况下,标准C ++库将自动链接。 - Nikita
我已经有了正确的设置,但是忘记将调试模式改为发布模式。 - SeeSoftware
在我的情况下,我们使用了IDA并希望删除所有 _scrt 函数。我们按照以下方式完成:链接器 -> 高级 -> 入口点,然后我们有了 "main" 函数,将其添加为 "main",现在它已经删除了所有这些函数。 - E235

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接