我试图弄清楚在Windows环境中如何将printf()
等标准C函数加载到内存中。
我知道crt0.obj
准备堆栈,调用int main(int argc, char **argv)
然后使用main返回的退出代码退出进程。
我还听说C标准函数位于名为shared library
的{{1}}中。我想知道msvcrt.dll
是否还加载了msvcrt.dll,或者是crt0
也是由编译器自动链接的。
谢谢你,对不起我的英语:)
答案 0 :(得分:3)
将始终存在运行时环境,例如msvcr80.dll(对于Windows变体),在安装环境时加载,无论是什么,即MSVCxx,Code :: Blocks with MinGW等。环境安装程序将包含标准C库(用于C环境)的.dll放入系统目录中,并提供在构建期间链接到的所有必需的静态库,以及原型的头文件和使用该环境所必需的定义。您只需设置路径,(查看.libs)和#include源代码中的正确标题。
注意,对于Linux等操作系统,运行时环境内置于操作系统中,并包含所有共享库(与.dll同义)静态库和标准C的.h。
关于你在msvcrt.dll上的问题,请阅读@ Eric上面的评论。来自Microsoft的当前RTE使用msvcrnnn.dll形式的命名约定(例如msvcr80.dll,msvcr100.dll,...等等,具体取决于寻址(32或64位),操作系统版本等)。
关于你的陈述:也由编译器自动链接。这完全取决于环境。如果您使用的是Microsoft的开发环境,那么可能已经设置了默认设置,以允许您的链接开箱即用。如果使用Microsoft库,但是从非Microsoft环境中,则需要设置路径和其他环境变量以获取.lib和.h位置。
(关于你的英语:它比我工作的大多数工程师所说的要好。)
答案 1 :(得分:1)
以下是一些关于 C 运行时和标准库 (1,2,3) 链接的好页面:
crt0.obj
是 libcmt.lib
的一部分,msvcrt.lib
是 CRT 静态库 (COFF archive)。您可以改为选择通过与 COFF 导入库 msvcr<version>.dll
静态链接来动态链接 CRT,这将导致在运行时与 libpcmt.lib
进行动态链接。
标准库在msvcprt.lib
中实现,动态版本为msvcp<version>.dll
,这会导致在运行时与libcmt.lib
动态链接。
我在 VS2017 上的 crt0.obj
没有 mainCRTStartup
对象文件存档成员,而是在 exe_main.obj
和 WinMainCRTStartup
中实现了 exe_winmain.obj
1}}