gcc 常用实例
前言
GCC (the GNU Compiler Collection) 是由GNU组织开发的编译器套件, 可以执行预处理,编译,汇编和链接动作. 这篇文章首先向大家介绍如何生成C语言的可执行文件, 共享库(动态库) 以及静态库, 然后介绍一下gcc常用的选项.
例子
-
以下的例子都在Ubuntu13.10 上使用gcc 4.8.1 测试通过. 假设有三个文件
- main.c 定义main函数
- a.c 定义add 函数
- b.c 定义sub 函数
- 可执行文件
-
gcc -o test main.c a.c b.c
-
共享库
- 生成共享库
- gcc -shared -o libmymath.so a.c b.c
- 使用共享库
- gcc -o test main.c -L. -lmymath
-
静态库
- 生成静态库
- gcc -c a.c b.c
- ar crv libmymath.a a.o b.o
- 使用静态库
- gcc -o test main.c -static -L. -lmymath
- 注意: 当ld的搜索默认搜索路径即包含共享库又包含静态库时, 默认选择链接共享库;若需要链接静态库, 则需要加上-static选项
选项
-
-I(大写的i) 添加路径到预处理器的搜索目录
-
使用方法 -IPATH
- gcc -I. -o test main.c a.c b.c
- gcc -I/home/tony/work/myheaer -o test main.c
-
注意: 在搜索头文件时, 通过-I添加的目录会优先与系统默认的搜索目录
-
- -D 预定义宏
-
使用方法 -DNAME
- gcc -DCONFIG_GATE -o test main.c
- 等同于: #define CONFIG_GATE=1
- gcc -DCONFIG_GATE_VALUE=128 -o test main.c
- 等同于: #define CONFIG_GATE_VALU=128
-
-
-c 执行编译和汇编, 但不执行链接动作, 生成中间文件
- gcc -c main.c a.c b.c
- 生成 main.o, a.o, b.o
- gcc -c main.s a.s b.s
- 生成 main.o, a.o, b.o
-
-S 执行编译动作, 但不执行汇编, 生成汇编文件, 通常文件后缀为.s
- gcc -S main.c a.c b.c
- 生成 main.s, a.s, b.s
- -L 添加路径到链接器的搜索目录
-
gcc -o test main.c -L.
- -l(小写的L) 在指定的library中查找符号表
-
gcc -o test main.c -L. -lmypath
- -Wall 打开所有的编译警告
-
gcc -Wall -o test main.c
- -static 优先选择链接静态库
-
gcc -o test main.c -static -L. -lmymath
- -shared 生成的目标为共享库
-
gcc -shared -o libmymath.so a.c b.c
-
-o 指定生成目标的名字
-
-Wl 传递参数给链接器
- gcc -o test main.c -Wl,-Map=out.map -L. -lmymath
- gcc -o test main.c -Wl,-rpath=/media/code/exercise/gcc -L. -lmymath
-
rpath 的作用是添加目录到运行时共享库搜索路径
- -g 生成debugging信息, 在使用debug工具比如GCB的时候需要
-
gcc -g -o test main.c a.c .bc