crt0加载msvcrt.dll吗?

时间:2014-04-15 20:02:31

标签: c++ c windows dll operating-system

我试图弄清楚在Windows环境中如何将printf()等标准C函数加载到内存中。 我知道crt0.obj准备堆栈,调用int main(int argc, char **argv)然后使用main返回的退出代码退出进程。

我还听说C标准函数位于名为shared library的{​​{1}}中。我想知道msvcrt.dll是否还加载了msvcrt.dll,或者是crt0也是由编译器自动链接的。

谢谢你,对不起我的英语:)

2 个答案:

答案 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.objlibcmt.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.objWinMainCRTStartup 中实现了 exe_winmain.obj 1}}