gcc学习记录

Posted 笨笨coding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gcc学习记录相关的知识,希望对你有一定的参考价值。

-Wall: 使输出中包含警告信息,提示一些可以避免的错误。如果没有错误,则不会输出信息。

-o:后面加上可执行文件的名字。如果不加-o选项,会默认生成a.out可执行文件。举例:gcc -Wall -o circle circle.c。因为加了-o circle,所以会生成circle可执行文件,而不生成a.out.

 

下面介绍四个过程:预处理,编译,汇编,链接。

1。预处理。

   预处理主要是执行预处理指令和扩展宏。gcc一般不产生预处理后的中间输出。可以使用-E来输出预处理得到的结果。

-E:直接使用gcc -E circle.c,产生的结果会在屏幕上输出,输出内容很多。因为它包含了若干头文件的内容。使用gcc -E -o circle.i,产生的结果会重定向到circle.i。file.i表示经过了预处理后的c源文件。加上-C会在预处理的结果中包括注释。gcc -e -C -o circle.i circle.c.

-D name[=definition]: 这个不是很懂,大概是用来条件编译的,需要和#ifdex name一起用。

-U name:也不懂,和上一个有点关系。未定义符号name.

-I directory[:directory[...]]:当在源码中使用#include指令时,会从该目录和系统标准include目录寻找。通常的寻找顺序为:1)该源文件所在目录。2)通过 -I 选项指定的目录。3)环境变量C_INCLUDE_PATH and CPATH指定的目录。4)系统默认include目录。

-I- :这个选项用来分割-I directory,在-I-左边的目录,不适用于带有尖括号的#include指令,比如#inlcude<stdio.h>,就是说在找stdio.h这个文件时,不会在-I-左边的目录中找。-I-左边的目录只适用于带引号的文件,比如#include "myheader.h"。对-I-右边的目录,尖括号和双引号的文件都可以找。当使用 -I - 使,上面的四个寻找步骤中的第一步会忽略。

 

2。编译。

编译的工作就是把c程序翻译成汇编程序。一般,每个CPU 架构都有自己的汇编语言,所以汇编语言很多。一般情况,gcc把生成的汇编代码存储在临时文件中,但是当汇编开始运行后,会把它给删掉。可以使用-S来查看生成的汇编代码。

-S : -S 会生成以.s结束的 汇编语言文件。gcc -S circle.c, 会生成circle.s文件。

为了在汇编代码中生成包含C 语言变量名的注释,可以使用-fverbose-asm。举例:gcc -S -fverbose-asm circle.c。

 

3。汇编(或组装)

因为每个机器结构有自己的汇编语言。gcc使用一个汇编器将汇编语言程序转换成可执行二进制文件。结果是对象文件,包含从源文件生成的可执行机器代码和外部链接文件中所有对象对应的符号表。生成的对象文件也是临时的,会在链接时被删除。使用 -c选项来生成对象文件。

-c: 对象文件以.o结尾。gcc -c circle.c.

 

4。链接

将多个二进制文件链接成一个可执行文件。有三种链接不在gcc搜索范围内的库文件方式。

1) gcc -o circle circle.c /usr/local/lib/libmath.a。库文件链接的方式类似于对象文件。

2)使用-L选项。举例:gcc -o circle -L/usr/local/lib -lmath circle.c. 可以使用多个库目录,这可以用多个-L实现,也可以在目录间加,分隔实现。

3)使包含库的目录包含在环境变量LIBARY_PATH中。

 

综上,

-save-temps: 会保存所有中间文件。

-fsyntax-only: 仅检查语法是否正确,不做预处理、编译等操作。

3)

 

以上是关于gcc学习记录的主要内容,如果未能解决你的问题,请参考以下文章

arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc的区别 ——ARM交叉编译器的学习(学习记录)

学习记录:gcc/g++ 编译与链接

linux学习记录-----安装软件

学习记录02 --- redis数据库的安装,以及主从复制和哨兵模式开启

makefile 学习记录简单的两个C文件编译

makefile 学习记录简单的两个C文件编译