在不使用MSVCRT运行时的情况下,在Visual Studio 2012中编译C程序

3
Visual Studio 2012(以及早期版本)可以编译C代码,但只能编译普通的C代码,而不是C++代码。如果您想避免运行时麻烦,这将是一个很好的功能。我想编译普通的C二进制文件,并希望在没有MSVCRT运行时的情况下实现这一点。在添加了/T C(编译为C)选项后,我希望得到一个仅具有基本依赖关系(如kernel32和ntdll)的二进制文件。但是,实际上链接的是:
我们想使用VS 2012,而不是运行时。GCC编译器不需要它,因此在VS中也必须有一种编译“简单”二进制文件的方法。我们不一定需要复杂的字符串函数或日期/时间库,只需要简单的代码。
问题:是否可以在Visual Studio 2012中编译没有MSVCRT运行时(甚至是C ++代码)的C代码?
编辑:不使用静态链接(/MT)。

我对VS/Windows并不是很熟悉,但printfstrcmpmemcpy这类函数会放在哪里?我的理解是MSVC运行时有点像Linux上的libc.so - us2012
为什么不用/MT呢?我认为它只链接你实际使用的东西。所以如果你不使用MSVCRT中的任何内容,它就不会链接任何东西。 - user2802841
我不确定,但我认为memcpy也可以在另一个DLL中使用,而且分布在Windows计算机上更广泛。 - bytecode77
我会使用 msvcrt.dll 来完成这个任务。这样做可行吗? - bytecode77
1
http://www.drdobbs.com/avoiding-the-visual-c-runtime-library/184416623 上有一些如何实现运行时独立性的信息。 - namezero
1个回答

6
“在Visual Studio 20xx中是否可以编译C代码(甚至是C++代码)而不需要MSVCRT运行时库?”的正确答案是使用/MT选项(配置属性>C/C++>代码生成>运行库=多线程(/MT))。这将创建一个没有任何MSVCRTxx依赖关系的可执行文件,完全符合您的要求。据我所知,它只是这样做。它不会对您想做的任何事情施加任何限制-所有标准C库函数(如memcpy)仍然有效。唯一的区别是.EXE文件稍微大一些。我已经使用MSVC6、MSVC2005、MSVC2008和MSVC2013多年来从纯ANSI C代码创建并分发这样的EXE文件,没有任何问题。

至于带有“无静态链接(/MT)”限定词的问题的答案,那么您不能。


并非全部正确。您可以从VS2005到VS2015中编译没有运行时和静态链接的DLL。需要注意的是,要避免未记录的行为、避免使用非托管C++并坚持使用纯非托管C。全局静态对象不会被初始化,您可能需要创建自己的微型运行时并坚持使用user32和kernel32 API调用。如果为使用与您所编译的平台不同的运行时编译的产品创建DLL插件,则特别重要。可以创建仅依赖于kernel32.dll的C++/CLI .Net插件DLL。 - birdwes

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