crt0 是否加载 msvcrt.dll
Does crt0 load msvcrt.dll?
我试图弄清楚如何在Windows环境中将标准C函数(如printf()
加载到内存中(。我知道crt0.obj
准备堆栈,调用int main(int argc, char **argv)
,然后使用 main 返回的退出代码退出进程。
我还听说 C 标准函数位于一个名为 msvcrt.dll
的共享库中。我想知道crt0
是否也加载了 msvcrt.dll或者有一个编译器也自动链接的msvcrt.lib
。
谢谢你,对不起我的英语:)
总会有一个运行时环境,例如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 位置。
(关于你的英语:它比我一起工作的大多数工程师说的要好。
以下是一些与 C 运行时和标准库 (1,2,3( 相关的链接页面:
crt0.obj
是CRT静态库(COFF存档(libcmt.lib
的一部分。相反,您可以选择通过与 COFF 导入库 msvcrt.lib
静态链接来动态链接 CRT,这将导致在运行时与msvcr<version>.dll
进行动态链接。
标准库是用libpcmt.lib
实现的,动态版本是msvcprt.lib
的,这将导致运行时与msvcp<version>.dll
的动态链接。
我在VS2017上的libcmt.lib
没有crt0.obj
的对象文件存档成员,而是似乎在exe_main.obj
中实现了mainCRTStartup
,在exe_winmain.obj
中实现了WinMainCRTStartup
- 挂起和取消挂起一个文件DLL
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- C++:将外部库链接到dll库
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 代码在 msvcrt .dll函数上设置断点失败
- 为什么我不能在另一台电脑上运行自己的dll(msvcrt.dll被错过)
- 链接到系统C库msvcrt.dll
- LNK 2005链接器出现msvcrt.lib(MSVCR90.dll)问题
- 是否可以在不安装可分发的 VC++ 包的情况下将 MSVCRT DLL 与我的应用捆绑在一起
- vc++2008安装项目msvcrt.dll
- 将针对msvcrt.dll编译的库链接到Visual Studio 10 c++应用程序中
- crt0 是否加载 msvcrt.dll
- Qt 5.4.0部署问题- msvcrt.dll中缺少vsprintf_s