GCC简介
GNU C Compiler,同时也是一个交叉编译器,适用于跨平台的嵌入式开发
指令
- 编译: gcc hello.c -o hello ,-o 表示生成可执行文件
编译过程(可参考此博文)
- 预处理(c源码文件->.i预编译文件)
- 编译(i文件->s汇编文件)
- 汇编(s汇编文件->o目标文件)
- 链接(o目标文件->可执行文件)
GCC支持的后缀名(见 man gcc Options Controlling the Kind of Output
)
后缀名 | 对应的语言 |
---|---|
.c | C源文件 |
.C/.cc/.cxx | C++源文件 |
.m | Object-C源文件 |
.i | 预处理的c源文件 |
.ii | 预处理的c++源文件 |
.s/.S | 汇编语言原始程序 |
.h | 预处理文件(头文件) |
.o | 目标文件 |
.a/.so | 编译后的库文件,静态库(Archive libraries)和动态库(shared object libraries) |
GCC使用参数分类(见 man gcc options
)
- 通用参数
- C参数
- C++参数
- Object-C参数
- 语言无关参数
- 警告参数
- 调试参数
- 优化参数
- 编译过程
- 预编译参数
- 汇编参数
- 链接参数
- 机器依赖参数
最常用的参数(见 man gcc synopsis
)
SYNOPSIS
gcc [-c|-S|-E] [-std=standard]
[-g] [-pg] [-Olevel]
[-Wwarn...] [-Wpedantic]
[-Idir...] [-Ldir...]
[-Dmacro[=defn]...] [-Umacro]
[-foption...] [-mmachine-option...]
[-o outfile] [@file] infile...
Only the most useful options are listed here; see below for the remainder. g++ accepts
mostly the same options as gcc.
gcc 源码
源文件相关指令
- 预处理生成预编译文件(.i)
gcc -E source.c -o source.i
- 编译生成汇编代码(.a)
gcc -S source.c -o source.s
- 生成目标文件(.o)
gcc -c source.c -o source.o
- 指定目标输出文件:
-o
选项 - 搜索头文件路径:
-I
- 包含调试信息:
-g
库函数相关指令
- 静态编译
gcc -static hello.c -o hello
- 动态编译
-shared
(默认情况下) - 添加搜索路径
-L
- 生成使用相对位置无关的目标代码
-fPIC(position independance code)
- 编译静态链接库
- 生成目标文件.o
- ar -crv [.a] [,o]
- 调用静态链接库
gcc -o[file] [file.c] -L 搜索路径(.a)
- 编译动态链接库
- 生成位置无关的目标代码 gcc -fPIC -c [.c]
gcc -shared [.o] -o [.so]
- 调用动态链接库
- 隐式调用:
gcc [file.c] -o [file] -L 搜索路径[file.so]
- 显示调用:在源程序中使用extern关键字
- 隐式调用:
警告
- 关闭所有警告
-w
- 发出gcc提供的所有有用的警告:
-Wall
- 发出ansi.c的所有警告
-penantic
头文件默认包含路径
- 命令
whereis stdio.h
- 路径
/usr/include/stdio.h
rm -r
动态库包含路径
- 动态库包含路径
/usr/lib
- 动态库包含配置文件
/etc/ld.so.conf.d/libc.conf
gcc类库的依赖关系
gcc的编译
- 下载相关压缩包
tar -xvjf gcc-4.7.1.tar.bz2
解压gcc- 解压
gmp mpc mpfr