1.基础使用
gcc是专门用来编译C语言的编译器,而g++是编译C++的编译器(也可以编译C语言,毕竟C++语言兼容C)。Linux下gcc默认使用8字节的指针。
- 下载安装:gcc的安装指令“sudo yum install gcc”(在Linux里大部分情况都是默认安装的),g++安装指令“sudo yum install -y gcc-c++”(注意这里是Centos环境,不同的系统环境安装指令可能不同)
- 编译代码:“gcc/g++ 源文件名 -o 预生成可执行文件名”即可编译生成二进制的可执行文件(如果没有给可执行文件命名和“-o”选项,则默认生成名字为a.out的可执行文件。其中“-o”选项是给生成的文件重命名的意思)
- 运行代码:在生成的可执行文件中(默认生成a.out)使用“./可执行文件名”指令即可运行可执行程序
2.gcc的编译细化指令
程序翻译的过程如下:
1.预处理:a.去注释b.宏替换c.头文件展开d.条件编译…
2.编译:C语言->汇编语言
3.汇编:汇编语言->可重定向二进制目标文件
4.链接:将多个“.o/.obj”文件合并->可执行文件/.exe gcc和g++也是遵循上述的顺序的。 有些语言是解释型的,不需要遵循上述规律,对于每个C/C++程序员都应该熟练掌握上述的流程。
对应每个过程,使用gcc会更加清晰明了。
2.1.预处理|生成预处理文件|gcc -E 源文件名 -o 预处理文件名(.i后缀文件)
这个指令就是把源文件转化成预处理后的文件。
利用vim的“vs”命令同时打开两个文件我们可以发现,main.i文件比main.c文件:注释被去掉了、宏被替换了、多出了头文件的内容、进行了条件编译。
2.2.编译|生成汇编文件|gcc -S 预处理文件名 -o 汇编文件名(.s后缀文件)
2.3.汇编|生成可重定位目标文件|gcc -c 汇编文件名 -o 可重定位目标文件名(.o后缀文件)
可重定向目标文件里面已经变成了二进制。
这个时候还不能完全运行这个文件,还需要经过链接,把库函数的文件链接过来。
2.4.链接|生成可执行文件|gcc 可重定位目标文件名 -o 可执行文件名
3.动态库/静态库
3.1.动、静态库文件与依赖
- 在Linux下“.so”后缀的文件为动态库,“.a”后缀的文件为静态库。
- 在Window下,“.dll”后缀的文件为动态库,“.lib”后缀的文件为静态库。
- 使用“file”指令可用于确定给定文件的类型,它通过检查文件的内容和一些元数据来识别文件类型,并输出相应的描述。这里输出了该文件是有动态链接的64位可执行文件(其中中间的libc就是指C的标准库)。
- 如果使用ldd则可以查看该文件依赖的动态库(这里是C语言的动态库)。
在user下的include目录下有很多的头文件,但是这些都是头文件,正常情况下C语言是需要把头文件的具体实现(也就是源代码)给出来的,但是C语言采取了库的方式来给出。
3.2.库函数的头文件在Linux的所在目录/usr/include中
3.3.库函数的动、静态库在Linux的所在目录/usr/lib64中(64位)
这里就包含了我们需要的各种动、静态库。而我们在写C语言的时候就会把这些库函数的实现也就是静态库和动态库和我们自己的代码链接为一个可执行程序。
3.4.动态链接和静态链接的区别
静态库(Static Library)和动态库(Dynamic Library)是在软件开发中常用的两种库文件形式。它们有以下几个区别:
- 链接方式:静态库在编译时将库的代码和应用程序的代码合并成一个可执行文件,应用程序与静态库的代码一起被链接到最终的可执行文件中。动态库在运行时,应用程序通过动态链接加载库文件,应用程序和动态库是分开存储的,运行时动态加载。
- 内存占用:每个使用该静态库的可执行文件都包含了静态库的完整副本,这可能导致可执行文件的体积较大。多个应用程序可以共享同一个动态库的实例,因此,动态库不会使每个应用程序的体积增大,而是在内存中共享已加载的动态库。
- 更新与维护:静态库的代码发生变化时,需要重新编译和链接应用程序才能体现更新,每个使用静态库的应用程序需要手动更新。当动态库的代码更新时,所有使用该动态库的应用程序可以无需重新编译,直接加载新的动态库即可。
- 可移植性:静态库在编译时被链接到应用程序中,因此应用程序与特定平台和编译器绑定,不太容易移植到其他平台。动态库是在运行时加载的,因此可以提供更好的可移植性,同一动态库可以在不同平台上使用,只需确保动态库本身可用。
- 总体而言:静态库在可执行文件中包含了所有相关代码,适用于独立部署或者对特定版本的依赖较高的场景。而动态库可以在运行时共享,减少内存占用,适用于多个应用程序共享和灵活更新的情况。选择使用静态库还是动态库取决于项目的需求和考虑的因素。
3.5.制作用于链接的静、动态库
这个可以使用VS2022制作,有的时候我们做好了接口,但是不希望别人看到具体的实现,就可以自己做一个用于链接的静、动态库。关于制作静态库,这里可以看看我的另外一篇博客《C语言静态库的创建和使用》。
3.6.gcc、g++默认形成的可执行程序使用动态链接
如果加上选项“-static”即可生成静态链接的可执行程序,下图可以看出两者大小的区别。
如果你的机器没有办法生成静态库,则需要自己安装,其中C语言静态库安装指令为“sudo yum install -y glibc-static”,C++静态库安装指令为“sudo yum install -y libstdc+±static”,然后在保证语法没有问题的情况下使用“gcc/g++ 源文件名 -o 可执行程序名 -static”即可。