Visual Studio 2015:在没有运行时库的情况下编译 C/C++
Posted
技术标签:
【中文标题】Visual Studio 2015:在没有运行时库的情况下编译 C/C++【英文标题】:Visual Studio 2015: Compile C/C++ without a runtime library 【发布时间】:2016-08-30 00:44:44 【问题描述】:有没有一种不用任何运行时库就可以用 Visual Studio 2015 编译 C/C++ 的方法?
我需要在没有运行时库的情况下进行编译,因为我正在创建自己的运行时库(用于我的操作系统)。
C/C++->代码生成->运行时库有选项 但我想要一个显示“无”的选项。
我知道丢失了 CRT 中的许多功能。
【问题讨论】:
最后我听说,用 Visual Studio 编译操作系统内核是不可能的——它根本不是为它设计的,它的许多部分都假设你在 WINdows 上运行。 还相关:Visual Studio 生成 PE 文件格式的可执行文件。您的操作系统运行什么文件格式? 另外:从这里开始:wiki.osdev.org/Visual_Studio 并直接进入“自定义 C++ 运行时” 这在技术上是可行的,只要 (a) 代码不进行任何 CRT 或 Win32 调用,并且 (b) 您覆盖默认入口点(_DllMainCRTStartup 或 _WinMainCRTStartup)默认为 CRT。然而,正如已经评论过的,您仍然会使用 Win32 ABI 获得 PE 格式的二进制文件。 @dxiv:虽然 PE 很有可能是我们所期望的,因为 UEFI 支持/使用(至少在某种程度上)。 【参考方案1】:要在不使用 C 运行时库 (CRT) 的情况下编译您的应用程序,请使用 /MT
、/NODEFAULTLIB
链接器选项并将 Linker -> Advanced -> Entry Point
处的入口点重新定义为代码中定义的函数,例如rawMain
。签名是:
DWORD CALLBACK rawMain();
没有C-runtime库你不能使用它的功能,如malloc
、free
、memset
等。你应该自己实现所有使用的CRT函数。例如。您可以将malloc
的用法替换为VirtualAlloc()
和free
的VirtualFree()
。
要检查 C 运行时是否未链接到您的应用程序,请使用 Dependency Walker。
【讨论】:
提示进一步调查,主要功能的CRT实现位于VC\crt\src\vcruntime\exe_common.inl
(VS2015)
@SeeSoftware 确保 Linker -> Input -> Ignore All Default Libraries
设置为 Yes
并检查 Linker -> Input -> Additional Dependencies
列表不包含任何 CRT 库。还要确保不包含任何C++ Standard Library Header Files
,因为在这种情况下,标准 C++ 库将自动链接。
我的设置正确,但忘记将调试更改为发布以上是关于Visual Studio 2015:在没有运行时库的情况下编译 C/C++的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2013/2015空闲CPU使用率
如何在 Visual Studio 2015 中保存时编译 .sass 文件
Visual Studio 2015企业在启动,卸载和修复时崩溃