二、GNU编译器(gcc)

1.GCC的基本特点

1)支持多种硬件架构 x86-64 Alpha ARM PowerPC SPARC VAX …
2)支持多种操作系统 Unix 、Linux 、BSD 、Android 、Mac 、 iOS 、Windows
3)支持多种编程语言 C 、C++ 、Objective-C、Java 、Fortran 、Pascal、 Ada
4)终端命令行查看GCC的版本 :gcc -v

2.构建过程

源代码(.c)-预编译->头文件和宏扩展-编译->汇编码(.s)-汇编->目标码(.o)-链接->可执行代码(a.out)
gcc -E hello.c -o hello.i - 预编译(编译预处理)
gcc -S hello.i - 获得汇编代码(hello.s)
gcc -c hello.s - 获得目标代码(hello.o)
gcc hello.o -o hello - 获得可执行代码(hello)
./hello - 运行可执行代码

3.文件名后缀

.h - C语言源代码头文件(可读文本)
.c - 预处理前的C语言源代码文件(可读文本)
.s - 汇编语言文件(可读文本)
.o - 目标文件(不可读的二进制)
.a - 静态库文件(不可读的二进制)
.so - 共享(动态)库文件(不可读的二进制)
.out - 可执行文件(不可读的二进制)

4.编译选项

gcc [选项] [参数] 文件1 文件2 …
-o: 指定输出文件 如:gcc hello.c -o hello
-E: 预编译,缺省输出到屏幕,用-o指定输出文件 如:gcc -E hello.c -o hello.i
-S: 编译,将高级语言文件编译成汇编语言文件 如:gcc -S hello.c
-c: 汇编,将汇编语言文件汇编成机器语言文件 如:gcc -c hello.s
-Wall:产生全部警告 如:gcc -Wall wall.c
-Werror:将警告作为错误处理 如:gcc -Werror werror.c
-x: 指定源代码的语言 xxx.c - C语言 xxx.cpp - C++语言 xxx.for - Fortran语言 xxx.java - Java语言,
如: gcc -x c++ cpp.c -lstdc++ -o cpp
-O0/O1/O2/O3: 指定优化等级,O0不优化,缺省O1折中优化,O2注重优化时间,O3注重优化空间

5.头文件

1)头文件里写什么? 头文件卫士
#ifndef _XXX
#define _XXX
#endif
重定义: 一个头文件可能会被多个源文件包含,写在头文件里的函数定义也会因此被预处理器扩展到多个包含该头文件的源文件中,并在编译阶段被编译到等多个不同的目标文件中,这将导致链接错误:multiple definition,多重定义。
2)去哪里找头文件?
gcc -I<头文件的附加搜索路径>
#include <my.h> 先找-I指定的目录,再找系统目录。
#include “my.h” 先找-I指定的目录,再找当前目录,最后找系统目录。
标准C库 :/usr/include
第三方库:/usr/local/include
编译器库:/usr/lib/gcc/i686-linux-gnu/5.4.0/include

6.预处理指令

#include - 将指定的文件内容插至此指令处
#define - 定义宏
#undef - 删除宏
#if - 如果
#ifdef - 如果宏已定义
#ifndef - 如果宏未定义
#else - 否则,与#if/#ifdef/#ifndef配合使用
#elif - 否则如果,与#if/#ifdef/#ifndef配合使用
#endif - 结束判定,与#if/#ifdef/#ifndef配合使用
#error - 产生错误,结束预处理
#warning - 产生警告,继续预处理
#line - 指定行号
#pragma - 设定编译器的状态或者指示编译器的操作
#pragma GCC dependency 被依赖文件 - 若被依赖的文件被修改则编译器会有提示信息
#pragma GCC poison 语法禁忌
#pragma pack(按几字节对齐:1/2/4/8)
#pragma pack() - 按缺省字节数对齐

7.预定义宏

无需自行定义,预处理器会根据事先设定好的规则将这些宏扩展成其对应的值。
BASE_FILE: 正在被处理的源文件名
FILE: 所在文件名
LINE: 所在行的行号
FUNCTION: 所在函数的函数名
func: 同__FUNCTION__
DATE: 处理日期
TIME: 处理时间
INCLUDE_LEVEL: 包含层数,从0开始
如:
#include “a” - 0层
#include “b” - 1层
#include “c” - 2层

8.环境变量

在进程向下文中保存的一些数据,格式:键(功能,是什么)=值(内容)。
终端命令行查看环境变量:env
C_INCLUDE_PATH:C语言头文件的附加搜索路径,相当于-I选项,CPATH 同C_INCLUDE_PATH 。
CPLUS_INCLUDE_PATH:C++语言头文件的附加搜索路径,相当于-I选项。
LIBRARY_PATH 链接库路径
LD_LIBRARY_PATH 加载库路径
#include “/…/…/xxx.h” - 移植性差

推荐使用编译时自己指定库路径:
#include “xxx.h”
gcc -I/…/… …

易冲突:当库在前面被找到时便停止了,有时候需要的库在后面的路径中
C_INCLUDE_PATH/CPATH=/…/…😕…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值