目录
gcc/g++基本了解
在Linux中,gcc/g++是用来编译链接形成可执行程序的工具。gcc是C语言的编译器,g++是C++的编译器。
gcc只能编译C,g++即可以编译C还可以编译C++。
基本指令
安装gcc/g++
sudo yum install -y gcc #安装gcc
sudo yum install -y gcc-c++ #安装g++
gcc 指定.c文件 #编译指定.c文件,形成可执行程序(在当前目录下,默认的可执行程序名为a.out)
g++ 指定.cpp文件 #编译指定.cpp文件,形成可执行程序(在当前目录下,默认的可执行程序名为a.out)
#选项
-o:可指定编译链接之后形成的可执行程序名称,一般后接名称
举个例子
这里使用gcc和g++分别编译链接test.c和test.cpp文件。运行时,执行./可执行文件名 即可。
./c.exe #执行可执行程序c.exe
./cpp.exe #执行可执行程序cpp.exe
程序的翻译过程
1、预处理
程序在预处理阶段,需要完成头文件展开、去注释、宏替换、条件编译等操作。
-E #文件开始编译链接,完成预处理操作之后就停下来。
举个例子
gcc -E test.c -o test.i #开始编译链接test.c文件,预处理结束之后就停下来。
浅看一下
main函数之前全是stdio.h的头文件展开和#define的宏替换。可以看出,去注释和条件编译也体现出来了。
-D A=10 #在gcc命令中使用,在编译的时候顺便定义宏
gcc -E test.c -o test.i -D B=10
浅看一下
在预处理阶段,程序还是我们能看懂的原语言。
2、编译
编译阶段,程序会被编译成汇编代码。
-S #程序开始编译链接,编译结束后停下来。
gcc -S test.c -o test.s
浅看一下
3、汇编
汇编阶段,程序会被翻译成可重定位目标二进制文件(目标文件)
-c #程序开始编译链接,汇编结束后停下来。
gcc -c test.c -o test.o
浅看一下(由于vim是文本编辑器,所以是以文本的方式打开test.o的,dan实际上test.o是二进制文件,所以这里会出现乱码)
4、链接
在链接阶段,二进制文件要和标准库文件进行链接,最终实现可执行程序文件。
gcc test.c -o c.exe #从test.c文件开始编译链接(从预处理开始),实现可执行程序
gcc test.o -o c.exe #从test.o文件开始编译链接(从链接开始),实现可执行程序
链接被分为静态链接和动态链接,一般gcc/g++都是动态链接。
动静态库/动静态链接
静态链接和动态链接都各自依赖静态库和动态库。
动态库Linux系统本来就有,静态库需要自己安装。
sudo yum install -y glibc-static #安装C静态库
sudo yum install -y libstdc++-static #安装C++静态库
ll /lib64/libc.a #查看C静态库是否存在
ll /lib64/libstdc++.* #查看C++静态库是否存在
能看到这两个文件说明C/C++库已安装。
Linux和Windows中库后缀名
库的后缀名 | Linux | Windows |
动态库 | .so | .dll |
静态库 | .a | .lib |
ldd 指定可执行程序 #查看指定可执行程序所依赖的库文件
比如说.c/.cpp中使用了printf函数/std::cout函数,这些函数都是在stdio.h/iostream头文件中的。在形成了二进制文件之后,由于在源代码中只是使用了这样的函数,但是没有实现部分,实现部分在stdio.h/iostream头文件中的。动静态库则是打包实现好了这种函数供我们调用。所以程序翻译过程最后一步需要链接,才能得以形成最终的可执行程序文件,这也是动静态库的意义。
使用动态库的这种链接称为动态链接,使用静态库的链接称为静态链接。且动态链接必须使用动态库,静态链接必须使用静态库。
库的本质就是打包实现好了的大家公用的函数,提高开发效率。
库都是二进制文件。
动态库
动态库就是可执行程序通过编译器所获得的公共地址。当程序运行到特定的函数时,程序可以通过这个公共的地址去访问库中对应的方法实现,完成这个调用函数的操作,完成之后回到程序中继续执行接下来的指令。
动态库比较节省资源。大家都从公共的地方去找。但是一旦损坏,就都不能用了。
静态库
静态库就是将特定的函数的实现部分,从库中找到并拷贝到源文件中去。
静态库不依赖库文件,同类型平台都可以直接使用。缺点就是可执行程序的体积比较大。
动态链接是gcc/g++默认的,静态链接需要带上-static选项。
相关指令
-static #使用静态链接
gcc test.c -o c.exe #动态链接形成可执行程序
gcc test.c -o c_static.exe -static #静态链接形成可执行程序
浅看一下
刚刚程序翻译过程是以C语言举例的,C++也一样,要编译C++程序以及动静态链接形成可执行程序,只需将gcc改为g++即可!
最后,如有不足,请各位大佬指正!!!