linux编译器gcc / g++ 使用
1.gcc 编译器编译c语言程序
gcc + 文件名(默认生成a.out 可执行程序程序)
![](https://img-blog.csdnimg.cn/22b72947346242ab8752ca7c75a6e94b.png)
我们执行a.out由两种方法(相对路径 \ 绝对路径)
![](https://img-blog.csdnimg.cn/18c080a6b2e8457db7fd86e3e4e8c5c6.png)
进行程序的翻译
1.预处理(进行宏替换、头文件展开、去注释、条件编译)
2.编译(生成汇编)
3.汇编(生成机器可识别代码)
4.链接(生成可执行文件或库文件)
1.预处理
gcc -E c语言文件
![](https://img-blog.csdnimg.cn/d88dc0090d7b45a4a42e1898ba385afd.png)
我们去掉 -o 不指定预处理完的内容放入指定的文件 , 那么预处理完的内容直接输出在命令行上(这样子没有任何意义)
我们可以观察 test2.i
![](https://img-blog.csdnimg.cn/fb7f9681efdb45e896dbbaf0bdab51f2.png)
2.编译
gcc -S 文件 (可以从 .c 文件开始 ,也可以从 .i 文件开始)
![](https://img-blog.csdnimg.cn/44261b8320084851acead30d04edd2a4.png)
- S 开始进行编译,编译完成后停止
3.汇编
上一阶段进行了编译,将 c语言转成了汇编语言,但计算机不可以直接执行汇编语言,汇编语言还需要编译器。
![](https://img-blog.csdnimg.cn/9d1ba0055cbb4a8a9b7576575b26047f.png)
这里的可重定向二进制目标文件(其实也就是 在vs 下的 .obj 文件了)
4.链接
![](https://img-blog.csdnimg.cn/eade4545b30b4cee85a52710bdc6b8c0.png)
![](https://img-blog.csdnimg.cn/dba5e1234ade4c82a8f95cf549da3f90.png)
ldd 查看可执行程序依赖第三方库的命令
![](https://img-blog.csdnimg.cn/39e27b7ec2494cbf9316fad759fa88bb.png)
链接如何理解????
![](https://img-blog.csdnimg.cn/3319b03cbb264db683d4e250799ac570.png)
动态链接、静态链接![](https://img-blog.csdnimg.cn/fcab9770309148668fc7710379ccd527.png)
那么我们gcc 编译器默认是动态链接方式 , 形成可执行程序
![](https://img-blog.csdnimg.cn/dde89a9084cd4c1bbcc7f484cccfc217.png)
![](https://img-blog.csdnimg.cn/1eab51f2406b4bc0bbbeff3e7bd7138b.png)
那么如果我们想静态链接呢???
-static
![](https://img-blog.csdnimg.cn/0dbaf78fea28460fb39fd7b5f7a9fdef.png)