main函数和入口函数
程序从main函数开始吗?!一般工作中,只要找到main函数就可以了,应用也都是从main函数里面开始写,那么main函数就是一些程序的开端吗?不是的。当执行main函数的第一行时,很多事情都已经完成了。
例如int main(int argc, char** argv ),在执行main函数之前,全局变量已经初始化完成了,main函数的参数也已经传进来了。而对于c++程序来说,main函数之前就已经完成可全局对象的构造,main函数结束之后还要完成全局对象的析构。所以操作系统装载好程序后,首先运行的不是main的第一行,而是某些别的代码(这些代码负责准备好main函数执行所需要的环境,并负责调用main函数,这样你才能使用它。mian函数结束后,记录main函数的返回值,结束进程)。
运行这些代码的函数被称为入口函数。而入口函数往往是运行库的一部分。那什么又是运行库呢?下面开始讲解。
运行库
定义:
运行库是一个经过封装的程序模块,对外提供接口,只要知道接口参数就可以自由使用。
公用代码集。把很多程序都要用的代码放到一起,规定好接口,由程序员调用。
C标准库和C运行库
以C运行库为例来讲讲解运行库。弄清楚C运行库之前先弄清楚C标准库。
C标准库:ANSI C,美国国家标准协会定义的标准C语言接口函数。这个接口函数由各个平台自己实现,就各个平台你怎么实现我不管,但是我调用的时候这个函数实现的必须是这么个功能,而函数的参数也只能是那么几个。例如调用fread函数,作为运行库的调用者我不需要关心你底层怎么实现的,不管什么系统,文件什么格式存储,我在任何支持C标准库的平台调fread,你就得让我把文件中的内容给读出来。所以C标准库的函数是完全可以跨平台移植的。类似于给UNIX操作系统制定的POSIX标准,都得遵照执行。截至c11标准,它共包含29个头文件。
C运行库:简称CRT,C Run-time Library,又叫C运行时库。C运行库又和C标准库有什么关系呢?
C运行库包含了C标准库,但是又针对于各自的操作系统做了延申。延申的这部分就不是标准了,这部分是各个平台根据自身开发的库。某种程度上说,C运行库是C标准库的一个扩展库。
为什么还要做延申?当然是C标准库定义的函数太少了,不够全面。可能由于标准出来太早的原因,当时多线程的概念并不成熟,所以C标准库里没有定义线程操作相关的函数,这就留给了运行库延申的空间。同时运行库还延申了自己的系统函数。这也就是Linux和Windows不兼容的那批函数,包括系统函数和线程函数等。
注意,这里说C标准库只是为了方便理解,并不是说C标准库一个可以独立于任何平台的一个库,其实C语言标准仅仅只是定义了C标准库的原型,并没有提供实现。这些C标准库是各个平台在开发自己的运行库时会将标准里的所有函数按照标准的要求实现,再做一些自己的延申。
所以,C运行库是和平台相关的,和操作系统相关的。
glibc 和 MSVC
不同平台有各自的C运行库。Linux系统的C运行库是gblibc,即上图中的Linux CRT,Windows下的标准库是MSVC,即上图中的Windows CRT。
glibc:GNU C,实际上是GNU C库,又称为glibc,即Linux平台下的C运行库。在各个Linux发行版中,glibc往往被称为libc6。
glibc的发行版主要由两部分组成,一部分是头文件,比如stdio.h、stdlib.h等,在Ubuntu下,位于/usr/include/。另外部分是库的二进制部分。主要包括C语言标准库,有静态和动态两个版本。动态库位于/lib/x86_64-linux-gnu/libc.so.6,静态库位于/usr/lib/libc.a,除了上述头文件及标准库,还有辅助程序运行的运行库,即在执行你的代码过程中进行main引导以及返回处理的代码,它们是/usr/lib/crt1.o、/usr/lib/crti.o和/usr/lib/crtn.o。它们在静态链接时被调用,是程序启动运行的关键。这几个库的功能就是为应用程序添加入口函数。
最基本、最常用的C标准库函数和系统函数在libc.so库文件中,几乎所有C程序的运行都依赖于libc.so。有些做数学计算的C程序依赖于libm.so,多线程的C程序依赖于libpthread.so。libc有时时专指libc.so这个库文件,而说glibc时指的是glibc提供的所有库文件。
MSVC
vs的运行库 MT MTd MD MDd区别_vs运行库-CSDN博客
最后拓展下C++标准库
C++标准库:是c标准库的一个超集,它把原来的c标准库名称做了修改(去掉.h, 开头添加c,例如time.h变为ctime)。
记录几个介绍这些内容比较好的博客:
基础概念——C标准、C运行库和glibc - Grooovvve - 博客园 (cnblogs.com)
c/c++运行库、标准库的关系_运行库和标准库的区别-CSDN博客